<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>hlegius &#187; developer</title>
	<atom:link href="http://programe.me/tag/developer/feed/" rel="self" type="application/rss+xml" />
	<link>http://programe.me</link>
	<description>programação, desenvolvimento, tecnologia e muito o que contar.</description>
	<lastBuildDate>Wed, 23 Nov 2011 17:26:38 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>8++ perguntas à @pedrocavalero</title>
		<link>http://programe.me/8-perguntas-a-pedrocavalero/</link>
		<comments>http://programe.me/8-perguntas-a-pedrocavalero/#comments</comments>
		<pubDate>Thu, 19 Aug 2010 11:28:22 +0000</pubDate>
		<dc:creator>hlegius</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[Séries]]></category>
		<category><![CDATA[developer]]></category>

		<guid isPermaLink="false">http://www.hlegius.pro.br/?p=656</guid>
		<description><![CDATA[Pedro Cavaléro, Javeiro, engenheiro da computação formado pelo ITA, possui um leque de certificações Java Sun/Oracle e pode ser encontrado no Twitter ou em seu blog pessoal. Tive a excelente oportunidade de conhecê-lo em minha pós-graduação onde ele na condição de professor ministrou aulas de Java, padrões de projeto e algumas coisas a mais que [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Pedro Cavaléro</strong>, Javeiro, engenheiro da computação formado pelo <a href="http://ita.br" target="_blank">ITA</a>, possui um leque de certificações Java Sun/Oracle e pode ser encontrado no <a href="http://twitter.com/pedrocavalero" target="_blank">Twitter</a> ou em <a href="http://pedrocavalero.com/" target="_self">seu blog pessoal</a>.</p>
<p>Tive a excelente oportunidade de conhecê-lo em minha pós-graduação onde ele na condição de professor ministrou aulas de Java, padrões de projeto e algumas coisas a mais que ele trazia &#8211; WebServices, Sistemas distribuídos, &#8230; &#8211; para agregar ainda mais as aulas.</p>
<p>Recentemente, mandei-lhe um e-mail convidando-o à participar daquelas renomadas 9 perguntas que faço com algumas pessoas no blog. As respostas &#8211; e perguntas, claro &#8211; seguem:</p>
<p><strong>1. Tudo começou&#8230;</strong><br />
Tudo começou quando minha mãe disse pra mim: &#8220;Meu filho, vou comprar um consórcio (olha como era difícil) de um computador&#8221;. &#8220;Legal mãe&#8221;, eu disse. &#8220;Pra que serve isso?&#8221;. Tinha eu 12 anos, numa era pré-internet. Quando chegou minha então 8a. série eu já havia decidido que ia trabalhar com computador. O quê exatamente ainda era incógnita.</p>
<p><strong>2. Formado em Engenharia da Computação pelo ITA. Como foi o processo &#8220;pré-universidade&#8221; e sua relação com o mundo exterior após ingressar ?</strong><br />
No meu ano de vestibular (3o. ano) descobri o ITA. Vi (já pela internet, numa era pré-google) que era um lugar onde eu poderia ir para São Paulo, numa faculdade renomada, e que teria um apoio de moradia e alimentação. Coisa que uma USP não me daria. Sou do Norte, de Belém do Pará. Era preciso um apoio pra que eu conseguisse isso.<br />
Passei, e quando cheguei aqui percebi o tamanho da briga que eu tinha saído (não tinha noção da briga que era o vestibular do ITA) e da briga que eu tinha entrado (o ITA mesmo). Muito mudou minha forma de ver o mundo, muito estudo mas principalmente as amizades que o clima do alojamento do ITA traz. E, aos retornos pra casa durante as férias, a saudade e o carinho de quem fica longe.</p>
<p><strong>3. O ITA é uma instituição de renome no país. Como um ex-aluno, de que forma você avalia o ensino, ambiente e convivência na universidade e, na sua opinião, qual o diferencial do ITA em relação as demais ?</strong><br />
O diferencial do ITA são os alunos. Mas, se não fosse a cobrança severa dos professores com as provas, faltas, as regras do ITA (como não poder repetir mais de uma vez o ano, de ser reprovado em no máximo 5 matérias durante o curso inteiro) e a disciplina consciente (nós no ITA abominamos cola. Quem cola é expulso de lá pelos próprios alunos com aval dos professores. Assim conseguimos fazer prova em casa, por exemplo. E sem consulta!) forçam os alunos a se organizarem, se unirem, tornarem-se companheiros. Sempre se diz por lá que quem se isola não termina o curso.</p>
<p><strong>4. Durante as aulas que ministrou em meu curso de pós, ficou bem claro que é um Javeiro nato, porém, diferente de muitos que já conheci, mente aberta para outras tecnologias &#8211; PHP, oi ?. Qual tecnologia você investiria tempo hoje e por quê ?</strong><br />
Java foi minha área de expertise e continua sendo. Uma tecnologia altamente abrangente e sólida. Mas não sou fanático como alguns. Reconheço os prós e contras da tecnologia e da linguagem. Por isso mantenho minha mente aberta para estudar outras tecnologias. Algumas, como o PHP, são muito presentes no dia-a-dia da internet e é preciso conhecê-las. PHP eu admiro pela abrangência, o que me impele a conhecê-la, mas vejo nela muitos revezes. As tecnologias da Microsoft são excelentes, mas possuem uma filosofia que não concordo. Tenho a mentalidade livre e por isso o Software Livre me seduz. O Java hoje consegue ser bem mais livre, com suas JSRs e JCPs e implementações de VM diversas.</p>
<p>As tecnologias que eu invisto tempo hoje são o próprio PHP, por necessidade; a linguagem Scala, pra mim a linguagem mais completa que temos hoje. Scala melhora minha modelagem orientação a objetos, entendimento de programação funcional, capacidade de criação de scripts simples e sistemas altamente escaláveis (twitter) e complexos. E integra com Java, que possui uma base sólida de frameworks para uso. Ainda gostaria de estudar Python, pela programação linux e sua capacidade de utilizar bibliotecas C e C++ sem ter que utilizar essas linguagens, mas o tempo não permite&#8230; Ah, ainda pesquiso ferramental que permita um desenvolvimento mais rápido sem perder a beleza de um código bem modelado.</p>
<p><strong>5. Certificações. Você tem uma porção delas, inclusive a SCEA que é um sonho ainda para mim. Elas agregaram alguma coisa na sua vida profissional ou foi mais para satisfazer seu lado pessoal &#8211; pendurar na parede ?</strong><br />
Eu ainda não terminei o SCEA. Passei na primeira parte e ainda falta terminar o projeto. Ainda quero fazer isso esse ano. Mas tenho outras cinco, desde a de Associates até a de Java Web Services. Elas começaram a me abrir portas em outros lados profissionais, em particular as aulas pois precisava de algo que comprovasse meus conhecimentos em Java sem ser por uma prova. Mas as portas foram mais abertas pelo Networking do que pelas certificações.<br />
Elas começaram para satisfazer um lado pessoal. Eu trabalhava e me considerava bom naquilo e era uma forma de me forçar a estudar mais e ter um comprovante disso, além do trabalho. Fazer certificações obrigam você a se aprofundar mais nos detalhes, coisa que não se faz no dia-a-dia. E a minha empresa me incentivava a esse crescimento, sem me obrigar. Isso ajuda muito.<br />
Eu indico as certificações. Mas não as considero como única credencial. Dá para tirar o SCJP e não saber nada de Web. Isso ser pré-requisito para um trabalho com Web não é muito lógico. Elas devem ser um meio, não um fim a ser perseguido.</p>
<p><strong>6. Java e Oracle. Como um Javeiro, você teme alguma ação que venha a prejudicar a comunidade ?</strong><br />
Sim, temo. James Gosling saiu de lá. Vários outros saíram. Houve muitas demissões. Mas as atitudes até então tem nos tranquilizado. O Netbeans não acabou, o MySQL também não, apesar do futuro ainda incerto. A JVM continua free embora tenha tido algumas mudanças na licença, que geraram algumas repercurssões.<br />
A Sun antes de ser vendida parece que se organizou para que isso não ocorresse. A OpenJDK foi uma jogada de mestre. Esperamos que a Oracle continue nesse caminho.</p>
<p><strong>7. Hoje muito se fala sobre boas práticas, padrões de projeto, modelagem rica, desenvolvimento orientado à testes e arquitetura em camadas. Qual a dica que você, um arquiteto de software, deixaria para aqueles que tem a arquitetura/engenharia de software como objetivo ? Quais passos indicaria para aqueles que pretendem lá chegar ?</strong><br />
Comecem do começo. Desenvolvam com alguém mais senior, aprendam como escrever um bom código. Façam modelagem de problemas, depois estudem o Gof. O Gof deve ser entendido e não usado simplesmente para dizer que seu projeto usa padrões de projeto. E ele é melhor entendido depois que você teve o problema. Ao arquitetar, lute pelas bases, alta coesão, baixo acoplamento. É isso que todas as grandes arquiteturas buscam fazer. O Spring nasceu com esse propósito. As arquiteturas padrão sempre lutaram por isso, apesar das dificuldades iniciais.<br />
Com essas bases, generalize. Estude tudo o que puder. Cada coisa nova é uma visão nova que se abre. Tudo tem seus prós e contras, e esses dependem do contexto que seu problema está. A arquitetura por melhor que seja não é a adequada para todos os casos. Saber analisar o contexto e saber colocar a arquitetura mais adequada em cada caso é o trabalho do arquiteto. Tem que gostar não é?</p>
<p><strong>8. Nas suas atuais responsabilidades, o gerenciamento, seja de pessoas ou projetos, provavelmente está incluso. Como você costuma gerenciar seu time, cronograma, divisão de atividades e até, relacionamento entre todos ?</strong><br />
Eu fiz minha pós-graduação em Gerência de Projetos. Interessante quando você estuda o PMBOK é que parece que sua tarefa termina quando o Plano do Projeto está pronto. Mas na realidade é quando ele começa. Eu trabalho um pouco na gerência do projeto, com os cronogramas e atividades e principalmente com a liderança técnica da equipe do projeto, organizando e mantendo as atividades integradas.<br />
A parte mais difícil é o gerenciamento das pessoas. Como manter a equipe coesa, motivada e com a produção no seu melhor? Eu gosto da máxima do Manifesto Ágil, &#8220;Indivíduos e interações mais do que processos e ferramentas.&#8221;. Conheça sua equipe, conheça os potenciais, seja transparente e confie. Mostrar que você confia na equipe é muito importante.</p>
<p><strong>8++. Javeiro, Arquiteto de Software e professor. Quais os possíveis próximos passos em sua carreira ? Imaginou-se assim algum dia ou tudo aconteceu como um &#8220;acaso&#8221; ?</strong><br />
As coisas tem acontecido naturalmente, sem muito planejamento. O esforço no estudo e na relação interpessoal tem me impulsionado nessa direção. Tenho pensado em investir mais em dar aulas mas sem parar de desenvolver como principal atividade. Para ensinar é preciso ter experiência, é isso que dá mais crédito àquele que fala.<br />
Espero mais para frente ter outras oportunidades, investir um pouco mais no estudo dos processos ágeis ou na melhoria dos tradicionais. Mas, acima de tudo, gosto de ver pessoas vindo trabalhar ou estudar comigo e saindo profissionais melhores, de saber que pude contribuir com algo de útil. Conseguir fazer isso e ainda gerar resultados, é uma experiência de vida muito gratificante.</p>
]]></content:encoded>
			<wfw:commentRss>http://programe.me/8-perguntas-a-pedrocavalero/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Procura-se o Programador Sênior</title>
		<link>http://programe.me/procura-se-o-programador-senior/</link>
		<comments>http://programe.me/procura-se-o-programador-senior/#comments</comments>
		<pubDate>Tue, 22 Jun 2010 15:19:29 +0000</pubDate>
		<dc:creator>hlegius</dc:creator>
				<category><![CDATA[Carreira]]></category>
		<category><![CDATA[Featured Articles]]></category>
		<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[developer]]></category>

		<guid isPermaLink="false">http://www.hlegius.pro.br/?p=455</guid>
		<description><![CDATA[O que muito é visto nas ofertas de &#8220;vagas&#8221; para programadores são os rótulos Júnior, Pleno e Sênior. Mas, como saber em qual destes níveis você está ? E, é possível tachar pessoas com estes níveis ? Já conversei com pessoas que batem o martelo facilmente dizendo: - É por tempo.  Eu programo em brainfuck [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">O que muito é visto nas ofertas de &#8220;vagas&#8221; para programadores são os rótulos Júnior, Pleno e Sênior. Mas, como saber em qual destes níveis você está ? E, é possível tachar pessoas com estes níveis ?</p>
<p style="text-align: center;">
<div class="wp-caption aligncenter" style="width: 510px"><a href="http://www.moma.org/collection/browse_results.php?object_id=79018"><img class=" " title="The Persistence of Memory" src="http://farm4.static.flickr.com/3023/3097529664_ffc705e57e.jpg" alt="The Persistence of Memory" width="500" height="333" /></a><p class="wp-caption-text">Salvador Dali, 1931 - The Persistence of Memory</p></div>
<p>Já conversei com pessoas que batem o martelo facilmente dizendo:</p>
<p style="padding-left: 30px;"><em>- É por tempo.  Eu programo em <a href="http://en.wikipedia.org/wiki/Brainfuck" target="_blank">brainfuck</a> há seis anos, logo sou sênior. </em></p>
<p>Será mesmo ?</p>
<p style="text-align: justify;">Em tempos modernos, fica ainda mais complexo fazer uma avaliação deste tipo para programadores, arquitetos ou engenheiros de software, pois, não é somente uma linguagem de programação que está em análise. É todo um contexto que abrange desde a escolha do ambiente de desenvolvimento até relacionamento com stakeholders e domínio em metodologias e paradigmas de desenvolvimento.</p>
<p style="text-align: justify;">Se temos a análise temporal como inválida, então o que espera-se de um dito sênior ?</p>
<p style="text-align: justify;">Para tal, conversei com três pessoas que estão diretamente envolvidas com estes aspectos.</p>
<p style="text-align: left;">&nbsp;</p>
<p style="padding-left: 30px; text-align: justify;">Creio que sim. Existem os profissionais seniores, porém muitas pessoas, e empresas, acabam confundindo o nível do profissional com o seu tempo de experiência.</p>
<p style="padding-left: 30px; text-align: justify;">Em minha visão, o tempo de experiência é importante, porém, não determinante para rotular um profissional, ou seja, é perfeitamente possível existirem seniores com 3 anos de experiência e juniores com 15 anos.</p>
<p style="padding-left: 30px; text-align: justify;">O profissional Júnior, é aquele que já desempenha as tarefas com certa autonômia, porém, necessita de um maior tempo de pesquisa e em alguns casos de orientação.</p>
<p style="padding-left: 30px; text-align: justify;">Por sua vez, o pleno já demora um tempo menor para realizar as mesmas tarefas além de não necessitar de orientações referente aquela tarefa. O que difere o pleno de um sênior é a visão holistica, ou seja, para ser um profissional sênior é preciso possuir habilidades complementares as necessárias para o desenvolvimento daquela tarefa, isso ajuda acima de tudo no desenho de uma melhor solução além de maior facilidade no tratamento de problemas.</p>
<p style="padding-left: 30px; text-align: justify;">Outro ponto que vale ser observado, é que muitas vezes o sênior é destacado para tarefas simples, que não exige um conhecimento avançado, como seguir um procedimento de criação de usuário. Esse fato, além de desmotivar o profissional, gasta recursos de forma imprudente, já que são os seniores que deveriam criar os procedimentos a serem seguidos, além de desenhar soluções para problemas e corrigir falhas críticas ou em serviços críticos.</p>
<p style="text-align: right;"><a href="http://twitter.com/bufoni" target="_blank">Vinícius Bufoni</a>, coordenador de engenharia web na <a href="http://www.vexcorp.com" target="_blank">Vex</a></p>
<p style="text-align: left;">&nbsp;</p>
<p style="text-align: left;">&nbsp;</p>
<p style="padding-left: 30px; text-align: justify;">Este é um assunto interessante. Na maioria dos lugares as pessoas usam &#8220;anos de experiência&#8221; como medida para classificar. Esta é, na minha experiência, uma das piores maneiras de se fazer este tipo de classificação. Uma pessoa que desenvolve em, digamos, JSP e Servlets Java por 10 anos não necessariamente tem 10 anos de experiência desenvolvendo software, ele tem experiência desenvolvendo JSP e Servlets! E mesmo assim, tempo gasto em uma tecnologia não está diretamente relacionado com proficiência nesta. Enfim, utilizar tempo para medir experiência é, normalmente, uma besteira.</p>
<p style="text-align: justify; padding-left: 30px;">A forma com que eu tenho lidado com esta relação entre níveis de desenvolvedores, atualmente, é usando algo chamado modelo Dreyfus de aquisição de conhecimento: <a href="http://en.wikipedia.org/wiki/Dreyfus_model_of_skill_acquisition" target="_self">http://en.wikipedia.org/wiki/Dreyfus_model_of_skill_acquisition</a> .</p>
<p style="text-align: justify; padding-left: 30px;">Normalmente eu tenho as áreas em que eu considero que meu time deve ser competente (este post: <a href="http://fragmental.tw/2009/11/24/i-wish-i-knew-that-before-getting-this-job-–-slides-and-long-notes/" target="_blank">http://fragmental.tw/2009/11/24/i-wish-i-knew-that-before-getting-this-job-–-slides-and-long-notes</a> da uma idéia sobre quais seriam estas áreas) e uso o Dreyfus para tentar entender onde cada um está nestas competências. Tem funcionado relativamente bem para mim mas ainda é, como sempre será, problemático e, por muitas vezes, injusto.</p>
<p style="padding-left: 30px; text-align: right;"><a href="http://fragmental.tw/" target="_blank">Phillip Calçado</a>, consultor na <a href="http://www.thoughtworks.com" target="_blank">ThoughtWorks</a></p>
<p style="text-align: left;">&nbsp;</p>
<p style="text-align: left;">&nbsp;</p>
<p style="padding-left: 30px; text-align: justify;">Do meu ponto de vista um profissional sênior é acima de tudo auto suficiente, é o tipo de profissional em que você não precisa passar o que deve ser feito, ele geralmente entende seu papel em uma equipe e como pode contribuir.</p>
<p style="padding-left: 30px; text-align: justify;">Um profissional Sênior consegue tomar decisões e assumir responsabilidades, ele não depende de alocações e precisa de muito pouca supervisão gerencial e técnica.</p>
<p style="text-align: justify; padding-left: 30px;">Geralmente um profissional Sênior também, está sempre atualizado e esta sempre ligado em tendências do mercado e em como adaptar estas novidades a sua realidade nos projetos em que esta envolvido.</p>
<p style="text-align: justify; padding-left: 30px;">&#8220;Tempo&#8221; de experiência na verdade não é tão importante, mas a diversidade e intensidade da experiência da pessoa é extremamente importante, se ele esteve envolvido uma grande diversidade de projetos e atuou em papeis dos mais diversos, um profissional sênior geralmente consegue se adaptar pois já trabalhou em diversos papéis e com diversos times.</p>
<p style="text-align: justify; padding-left: 30px;">No caso de grandes empresas de Internet, como o Yahoo!, é vital que o profissional sênior entenda de e tenha tido vivência com projetos de grande escala, e que entenda de Sistemas, arquiteturas e plataformas que funcionem com grandes volumes de acesso e demandam muita performance.</p>
<p style="text-align: justify; padding-left: 30px;">Não gosto muito destes rótulos, mas um profissional Pleno depende de um nível de supervisão/apoio maior. Um Pleno também tende a ser mais inseguro na tomada de decisões e definições mais complexas.</p>
<p style="text-align: justify; padding-left: 30px;">Mas a principal diferença é a experiência, bagagem de conhecimento. Em entrevistas sempre pergunto qual foi o maior desastre da carreira da pessoa, espero que ele me diga quais foram os erros e o que ele aprendeu com isso. Isso mostra maturidade em relação a tentativa/erro, onde não se deve temer cometer erros e que sempre devemos aprender com eles e continuar tentando. Isso é chave para ser inovador.</p>
<p style="text-align: right;"><a href="http://me.me/acarlos1000" target="_blank">Antônio Carlos Silveira</a>, diretor de Produto e Engenharia, <a href="http://yahoo.com.br" target="_blank">Yahoo! América Latina</a></p>
<p style="text-align: right;">
<p style="text-align: left;">Cada um tem seus métodos de análise, mas ficou evidente que contar os dias no calendário já não é mais tão convincente como parecia <img src='http://programe.me/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://programe.me/procura-se-o-programador-senior/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Ser programador</title>
		<link>http://programe.me/ser-programador/</link>
		<comments>http://programe.me/ser-programador/#comments</comments>
		<pubDate>Sun, 25 Apr 2010 18:19:15 +0000</pubDate>
		<dc:creator>hlegius</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Featured Articles]]></category>
		<category><![CDATA[developer]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[projetos]]></category>

		<guid isPermaLink="false">http://www.hlegius.pro.br/?p=564</guid>
		<description><![CDATA[Quando decidi, aliás, percebi, que eu tinha vontade de estudar programação, nunca passou pela minha cabeça o quão difícil era criar uma aplicação a nível profissional. Iniciei na segunda metade de 2004, instalando um daqueles all in one for Windows (PHP, Apache, MySQL) e em uma semana estava fazendo uns ifs e submetendo formulários via [...]]]></description>
			<content:encoded><![CDATA[<p>Quando decidi, aliás, percebi, que eu tinha vontade de estudar programação, nunca passou pela minha cabeça o quão difícil era criar uma aplicação a nível profissional.<br />
Iniciei na segunda metade de 2004, instalando um daqueles <em>all in one</em> <em>for Windows</em> (PHP, Apache, MySQL) e em uma semana estava fazendo uns <em>ifs</em> e submetendo formulários via HTTP POST.</p>
<div class="wp-caption aligncenter" style="width: 510px"><a href="http://www.flickr.com/photos/harmony19490/363024712/"><img src="http://farm1.static.flickr.com/138/363024712_5783b2bee0.jpg" alt="" width="500" height="333" /></a><p class="wp-caption-text">&quot;Java printout por Ngọc Hà @ flickr&quot;</p></div>
<p>Naquela época era claro para mim que programação era algo relacionado à área de exatas, pois criar uma aplicação é algo lógico tendo envolvimento direto com matemática e tudo mais.<br />
Em coisa de um mês e pouco já conseguia fazer até uns &#8220;SQLs&#8221; e montava sites no estilo <em>macarrônico</em> de desenvolver. Aquilo para mim era fantástico! Tinha como objetivo aprender bem a linguagem para assim conseguir <a title="Zend Certified Engineer" href="http://www.zend.com/en/store/education/certification/authenticate.php/ClientCandidateID/ZEND010366/RegistrationID/231431226" target="_blank">minha certificação da Zend</a>, tornando-me assim um programador profissional.</p>
<p>Aconteceu porém, algo inesperado: comecei a &#8220;seguir&#8221; &#8211; não era no Twitter, até porque ele ainda era um protótipo de projeto na época &#8211; pessoas realmente profissionais em desenvolvimento de software e eu percebi assim que o buraco era mais embaixo e que eu ser excelente em uma linguagem era apenas um dos passos para tornar-me um programador profissional.</p>
<p>Abrindo um parênteses, eu li através do <a href="http://www.twitter.com/sergioprado" target="_blank">@sergioprado</a>, não lembro onde agora, uma frase interessante e que tem como tradução algo como:</p>
<pre>"O caminho para tornar-se mestre: siga o mestre; ande com o mestre;
torne-se o mestre."</pre>
<p>Após começar eu a seguir os mestres, pude perceber que programação vai muito além da leitura de um requisito funcional de software e fazer daquilo algo sistêmico. Hoje, arrisco-me a dizer que programação não é algo somente relacionado à exatas. Possuí também, questões éticas &#8211; humanas &#8211; e artísticas.</p>
<p><strong>A programação é relacionada a área de exatas</strong></p>
<p>Isso é bem claro aos envolvidos em desenvolvimento de software. Você lê um problema descritivo, vulgo especificação funcional, ou visual (UML, rabisco na <a href="http://www.amazon.com/s/ref=nb_sb_noss?url=search-alias%3Daps&amp;field-keywords=moleskine&amp;x=0&amp;y=0" target="_blank">Moleskine</a>, <em>whatever</em>) e faz daquilo algo sistêmico e que agregue valor ao negócio de seu cliente.</p>
<p>Como premissa você precisa aprender uma linguagem. Conhecer uma linguagem bem não é nada fácil. Você precisa empenhar-se para conhecer as intrínsecas e peculiaridades para aproveitar o melhor dela, tornando-se um especialista na linguagem. Eu valorizo mais um programador excelente em uma linguagem a um que já &#8220;trabalhou&#8221; com várias. Não é impossível uma pessoa ser excelente em mais de uma linguagem, mas isto, porém, demandaria muito tempo de dedicação para atingir tal nível.</p>
<p><strong>A programação é relacionada a ética</strong></p>
<p>Toda área tem suas condutas éticas e humanas, óbvio. Em programação, porém, vejo muitos ditos programadores ignorando isto. Quando você troca qualidade por falso ganho de tempo, você está sendo antiético. Quando não analisa corretamente as decisões que irá tomar em cima de algum problema, falta-lhe ética. Quando deixa de atentar seu cliente, o que inclui seu chefe, sobre a ausência de segurança, qualidade ou algum problema em cascata que venha a aparecer em decorrência de uma atitude, você está sendo antiético.</p>
<p>E isso acontece em demasia em nossa área! Seja por falta de interesse por parte do dito programador ou mesmo por medo de perder o emprego/projeto por &#8220;afronto&#8221; ao seu chefe ou cliente.</p>
<p>Para conhecer as técnicas, metodologias e artimanhas no desenvolvimento de software é necessário antes, ter uma boa noção de análise e projeto de software; arquitetura de aplicações; padrões e melhores práticas, para, após criticar uma atitude antiética de seu chefe/cliente, você ter total embasamento para propor a solução sem comprometer o projeto nem a aplicação. Isto será necessário também, para você ter um vocabulário comum para quando estiver numa roda de conversa entre os &#8220;mestres&#8221; da área.</p>
<p>Importante ressalvar que seu cliente ou chefe pode estar tomando uma atitude antiética, no ponto de vista de programação, inconscientemente. Afinal ele é especialista no negócio, o programador profissional é você! <img src='http://programe.me/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><strong>A programação é também relacionada a artes</strong></p>
<p>Há uma enorme diferença entre criar algo que funcione e criar algo que além de funcionar, transparece o domínio (regra de negócio).</p>
<p>Eu posso saber ler e escrever em português, mas há uma diferença gritante entre um poeta português e eu. Ele, diferentemente de mim, sabe utilizar muito bem as palavras e com elas, faz transparecer sentimentos, idéias e pensamentos sobre determinado tema, trazendo um enredo ao assunto abordado, envolvendo-nos em sua história.</p>
<p>Posso saber desenhar, mas isso não me torna um artista que emociona as pessoas com minhas obras.</p>
<p>Como programadores profissionais é fundamental conseguirmos fazer o mesmo ! É de nossa responsabilidade criar um código simples, legível e que conte toda a história da aplicação através de seus pacotes, classes, métodos, parâmetros, atributos e variáveis. Qualquer coisa diferente disso, não pode ser aceito como código profissional.</p>
<p>Pouco importa se a linguagem X é tachada como mais poluída que a Y. Você como profissional, tem que quebrar essa barreira e torná-la tão legível quanto qualquer outra, afinal, você é especialista na linguagem, lembra ?</p>
<p>Além de criar, é nossa responsabilidade cuidar para que o código continue sempre otimizado por tantas quantas forem as mudanças que nele ocorrer. Criar algo legível recai diretamente sobre isto, pois, no futuro outro profissional em programação poderá continuar seu trabalho sem danificar ou abandonar as premissas cruciais para um bom código. <a href="http://www.amazon.com/Pragmatic-Programmer-Journeyman-Master/dp/020161622X/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1272218331&amp;sr=8-1" target="_blank">Andrew Hunt</a> aborda o título: <em>&#8220;Don&#8217;t live with broken windows&#8221;</em>, onde resumidamente ele alerta para não descuidarmos da qualidade, pois, basta uma janela quebrada em uma casa para que ela transpareça o estado de abandono, fazendo assim, com que outras pessoas destruam mais janelas.</p>
<p>E como toda arte, não há uma receita para criar bons softwares. É necessário muito empenho, ler muitos códigos, revisar muitos paradigmas ao longo do tempo e claro, programar bastante. Não é possível tornar-se um programador profissional sem conhecimento teórico, tão pouco, sem vivência com erros e acertos.</p>
<p>Ao desenvolver a aplicação, não aceite nada menos do que seu melhor naquilo e atente-se para não cair na armadilha de criar softwares de forma sistematizada. Tenha autocrítica para fazer avaliações em seus próprios códigos e evitar assim, programar por coincidência.</p>
<p>Lembre-se de que será seu nome no <em><strong>@author.</strong></em> <img src='http://programe.me/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://programe.me/ser-programador/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Twig &#8211; Uma outra engine de templates em PHP</title>
		<link>http://programe.me/twig-uma-outra-engine-de-templates-em-php/</link>
		<comments>http://programe.me/twig-uma-outra-engine-de-templates-em-php/#comments</comments>
		<pubDate>Wed, 17 Feb 2010 10:14:47 +0000</pubDate>
		<dc:creator>hlegius</dc:creator>
				<category><![CDATA[hlegius]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Software livre]]></category>
		<category><![CDATA[developer]]></category>
		<category><![CDATA[Twig]]></category>

		<guid isPermaLink="false">http://www.hlegius.pro.br/?p=467</guid>
		<description><![CDATA[Fui apresentado ao Twig não há muito tempo, mas logo me interessei pela proposta do projeto: simplicidade e flexibilidade ao trabalhar com templates em PHP. Resumidamente é um projeto criado pelo Fabien Potencier - para quem não o conhece é o criador do symfony framework &#8211; e salvo engano há rumores de que ele pretende [...]]]></description>
			<content:encoded><![CDATA[<p>Fui apresentado ao <a href="http://www.twig-project.org">Twig</a> não há muito tempo, mas logo me interessei pela proposta do projeto: <em>simplicidade e flexibilidade</em> ao trabalhar com templates em PHP.</p>
<p>Resumidamente é um projeto criado pelo <strong>Fabien Potencier </strong>- para quem não o conhece é o criador do <a href="http://www.symfony-project.org">symfony framework</a> &#8211; e salvo engano há rumores de que ele pretende integrar o Twig à versão 2.x do symfony removendo o PHP super verboso que rola nos templates do symfony desde seu lançamento. <em>* carece fontes concretas</em></p>
<p>Recursos bacanas e uma sintaxe à lá Django nos templates me chamou muita atenção para não só mais olhar, mas sim, testar para ver melhor a ferramenta.</p>
<p>Não demorou para eu testar como ele se portaria diante de objetos no template e para minha tristeza, para ele ler um atributo, depende nada mais, nada menos do que <strong>__get()</strong> e <strong>__isset()</strong>. É possível também, assim como na JSTL ler um atributo iniciado por get. No template você deveria chamá-lo sem esse get. i.e: getFoo() no template seria apenas foo.</p>
<p>Imediatamente, o que vem a mente de quem trabalha com OO ? Quebra brutal de encapsulamento. Sim, <strong>__get() </strong>por mais fácil que possa parecer, quebra totalmente a segurança de uma variável membro, uma vez que os atributos da mesma tornam-se públicos.</p>
<p>Tentei entrar em contato com o Fabien para ver o motivo que o levou a implementar assim. Ele, bem receptivo <em>- ironia mode on -</em> disse-me: se tiver um patch mande-o, do contrário, peço que seja paciente.</p>
<p>Fiz o patch, revi algumas coisas e mantive compatibilidade com o <strong>__get() __isset()</strong> que o Twig originalmente aceita e criei um Fork do <a href="http://github.com/hlegius/Twig">projeto no GitHub</a>.</p>
<p><strong>Features default</strong></p>
<ul>
<li>Suporte a plugins</li>
<li>Variáveis</li>
<li>Leitura de arrays por índices int ou string</li>
<li>Arrays multidimensionais</li>
<li>Objetos (via __get() __isset() apenas)</li>
<li>Objetos alinhados (Nested Objects) com __get() __isset() também</li>
<li>Blocos de controle, loops, etc.</li>
</ul>
<p><strong>Mudanças</strong></p>
<p>Métodos públicos começados por:</p>
<ul>
<li> get</li>
<li>is</li>
<li>has</li>
<li>match</li>
<li>contain</li>
</ul>
<p>Podem ser chamados no template sem qualquer problema sem a necessidade dos métodos mágicos.<br />
Abaixo exemplos funcionais:</p>
<p><code></p>
<pre>//...
/**
 * SomeVar
 * @var string
 */
 private $baz;
 /**
 * Bar Object
 * @var Bar
 */
 private $bar;
 /**
 * Magic String with __get
 * @var string
 */
 public $magic;

 public function __construct() {
    $this-&gt;baz = "Value of Foobar::\$baz";
    $this-&gt;bar = new Bar();
    $this-&gt;magic = 'Magic methods still working !';
 }

 /**
 * @return string
 */
 public function getBaz() {
     return $this-&gt;baz;
 }

 /**
 * @return boolean
 */
 public function hasBaz() {
     return (!empty($this-&gt;baz)) ? true : false;
 }

 private function hasIamNull() {
     return false;
 }

 public function fakehasFoo() {
     return 'I will not be displayed !';
 }

 public function matchesWith($otherString) {
     return ('foo' === $otherString);
 }

 public function getBar() {
     return $this-&gt;bar;
 } // ....</pre>
<p></code></p>
<p>No template teriamos:</p>
<p><code></p>
<pre>&lt;body&gt;
 &lt;h1&gt;Meu título&lt;/h1&gt;
 &lt;p&gt;Bar foo&lt;/p&gt;

 {% if foo.hasBaz %}
 &lt;p&gt;{{ foo.getBaz }}&lt;/p&gt;
 {% endif %}

 {% if foo.hasIamNull %}
 &lt;p&gt;{{ foo.getBaz }}&lt;/p&gt;
 {% endif %}

 &lt;p&gt;{{ foo.getAbstractBaz }}&lt;/p&gt;

 &lt;p&gt;{{ foo.getIamPublic }}&lt;/p&gt;

 &lt;p&gt;{{ foo.fakehasFoo }}&lt;/p&gt;

 &lt;p&gt;{{ foo.getBar.getHlegius }}&lt;/p&gt;

 &lt;p&gt;{{ foo.getBar.getBarFoo.getTwig }}&lt;/p&gt;
 &lt;p&gt;{{ foo.getBar.getBarFoo.tryToCallMe }}&lt;/p&gt; &lt;!-- private function, fails. --&gt;

 &lt;p&gt;{{ foo.methodThatIsnotExists }}&lt;/p&gt; &lt;!-- without error --&gt;

 {% if foo.matchesWith('foo') %}
 &lt;p&gt;Yeah, it's matches !&lt;/p&gt; &lt;!-- will matches --&gt;
 {% endif %}

 {% if foo.matchesWith('baz') %}
 &lt;p&gt;Yeah, it's matches again :S !&lt;/p&gt; &lt;!-- will NOT matches --&gt;
 {% endif %}</pre>
<p></code></p>
<p>Métodos não permitidos, índices não existentes e outros tipos de erros são omitidos por default.</p>
<p>Ainda penso em melhorar e implementar mais coisas ao projeto. Minha ideia inicial é ir sempre atualizando do projeto oficial para não distanciar-se muito. O patch eu também encaminhei ao próprio Fabien, mas ainda ele sequer respondeu ao meu e-mail.</p>
<p>Quem já utiliza o Twig e quiser testar <a href="http://github.com/hlegius/Twig">essa nova versão mais &#8220;Object-oriented friendly&#8221;</a> farei questão de dar total suporte e apoio para mantê-la up to date <img src='http://programe.me/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
Há ainda, exemplos de uso e do que você pode fazer com o Twig que eu modifiquei. Detalhes você encontra no <a href="http://github.com/hlegius/Twig/tree/master/examples/">diretório examples</a> do projeto.</p>
]]></content:encoded>
			<wfw:commentRss>http://programe.me/twig-uma-outra-engine-de-templates-em-php/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Eu uso estático porque é mais rápido.</title>
		<link>http://programe.me/eu-uso-estatico-porque-e-mais-rapido/</link>
		<comments>http://programe.me/eu-uso-estatico-porque-e-mais-rapido/#comments</comments>
		<pubDate>Sun, 14 Feb 2010 14:04:04 +0000</pubDate>
		<dc:creator>hlegius</dc:creator>
				<category><![CDATA[Arquitetura]]></category>
		<category><![CDATA[Featured Articles]]></category>
		<category><![CDATA[OOP e Patterns]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[developer]]></category>
		<category><![CDATA[teoria]]></category>

		<guid isPermaLink="false">http://www.hlegius.pro.br/?p=488</guid>
		<description><![CDATA[Ouvi e já pude ler isto não uma, nem duas, mas sim diversas vezes. Argumentação padrão de quem defende uma &#8220;Orientação à Objetos mais estática&#8221; &#8211; se é que podemos chamar isso de OO. Vejamos um exemplo nada científico que fiz: Criei os seguintes exemplos: &#60;?php class Estatico { public static function fazAlgumaCoisa() { $i [...]]]></description>
			<content:encoded><![CDATA[<p>Ouvi e já pude ler isto não uma, nem duas, mas sim diversas vezes. Argumentação padrão de quem defende uma &#8220;Orientação à Objetos mais estática&#8221; &#8211; se é que podemos chamar isso de OO.</p>
<p>Vejamos um exemplo nada científico que fiz:</p>
<p>Criei os seguintes exemplos:</p>
<p><code></p>
<pre>&lt;?php
class Estatico {

    public static function fazAlgumaCoisa() {
        $i = 0;
        while ($i &lt; 10000) {
           echo Estatico::outraCoisa();
           $i++;
        }
    }

    public static function outraCoisa() {
        return "Conteúdo";
    }
}

Estatico::fazAlgumaCoisa();</pre>
<p></code></p>
<p><code></p>
<pre>&lt;?php
class Instancia {

    public function fazAlgumaCoisa() {
        $i = 0;
        while ($i &lt; 10000) {
            echo $this-&gt;outraCoisa();
            $i++;
        }
    }

    public function outraCoisa() {
        return "Conteúdo";
    }
}
$objInstancia = new Instancia();
$objInstancia-&gt;fazAlgumaCoisa();</pre>
<p></code></p>
<p>Os resultados após rodar quatro vezes cada foram:</p>
<p><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/02/estatico.png"><img class="aligncenter size-medium wp-image-491" title="Chamadas estáticas em PHP" src="http://www.hlegius.pro.br/wp-content/uploads/2010/02/estatico-300x68.png" alt="" width="300" height="68" /></a></p>
<p style="text-align: center;"><a href="http://www.hlegius.pro.br/wp-content/uploads/2010/02/instancia.png"><img class="aligncenter" title="Chamada em instância em PHP" src="http://www.hlegius.pro.br/wp-content/uploads/2010/02/instancia-300x66.png" alt="" width="300" height="66" /></a></p>
<p>Ou seja: <strong>91.09 ms para o estático</strong> contra <strong>90.07 para a versão non-static</strong>. Obviamente foi apenas um teste sem qualquer relevância, pois rodei em minha máquina pessoal com várias outras aplicações rodando em background. É perceptível porém, que a diferença não é absurda que compense o uso de estático por este motivo.</p>
<p>Deixando a questão de &#8220;performance&#8221; de lado, partimos para questões arquitetônicas:</p>
<ul>
<li>Identidade</li>
<li>SoC &#8211; Separation of Concerns (Principio de Separação das Responsabilidades)</li>
<li>Encapsulamento</li>
<li>Estado</li>
<li>DRY &#8211; Don&#8217;t Repeat Yourself</li>
<li>Associações &#8211; sejam elas composições ou agregações</li>
</ul>
<p>Ao perder Identidade e Estado as possibilidades daquele método &#8211; ou da classe inteira, caso use estático em tudo &#8211; tem o leque de utilidade reduzido para:</p>
<ul>
<li>Service</li>
<li>Facade</li>
<li>Factory</li>
<li>Helpers &#8211; no âmbito de serem apenas funções que realizam determinada tarefa na aplicação sem qualquer valor ao Domínio</li>
</ul>
<p>Com isso, perdemos também o Princípio de Separação das Responsabilidades, ou seja, a classe perde o controle sobre a integridade dos dados que ela deveria controlar e proteger contra acesso ou alteração indevidos.</p>
<p>Listei o DRY também por um motivo simples: com métodos estáticos, perdemos a grande chance de usar as variáveis de instância da classe à favor da mesma. Exemplo:</p>
<p><code></p>
<pre>class UsuarioEstatico {

    public static function login($usuario, $senha) {
        // valida o usuário e zaz
        $autenticador = new Autenticador();
        $autenticador-&gt;autentica($usuario, $senha);
    }

    public static function logout($usuario) {
        // verifica se a sessao está aberta
        $autenticador = new Autenticador();
        $autenticador-&gt;fechaSessaoPara($usuario);
    }
}</pre>
<p></code></p>
<p><code></p>
<pre>class Usuario implements Autenticavel {
    private $autenticador;

    public function __construct($usuario, $senha) {
        // manipula os dados de entrada
        $this-&gt;autenticador = new Autenticador($this);
    }

    public function login() {
        return $this-&gt;autenticador-&gt;autentica();
    }

    public function logout() {
        return $this-&gt;autenticador-&gt;fechaSessao();
    }
}</pre>
<p></code></p>
<p>Repare no modelo estático: foi necessário instanciar o antenticador por duas vezes em pontos diferentes. Opa, repetiu ! Mesmo que o autenticador fosse estático, teriamos duplicação, pois teriamos que certificar que o usuário existe e tudo mais. Isso porque não comentei como ficaria o lado cliente dessa implementação estática. O cliente &#8211; seja Controller, WebService ou qualquer classe em outra camada no domínio &#8211; teria que conhecer muita coisa sobre implementação dessa classe para poder manipulá-la.</p>
<p>Como bônus, repare que perdemos neste caso também o Polimorfismo, uma vez que eu poderia ter esse Autenticador() como base de autenticação para qualquer tipo (Usuário, Funcionário, Gerência, Administradores&#8230;)</p>
<p>O uso de métodos ou funções &#8211; sim, há diferença &#8211; estáticas pode ser bem-vindo nos itens já enumerados. Alguns developers porém, ainda que nestes casos são contra o uso por achar a ideia estática demasiadamente anti-oo.</p>
]]></content:encoded>
			<wfw:commentRss>http://programe.me/eu-uso-estatico-porque-e-mais-rapido/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>O manual, por favor !</title>
		<link>http://programe.me/o-manual-por-favor/</link>
		<comments>http://programe.me/o-manual-por-favor/#comments</comments>
		<pubDate>Tue, 24 Feb 2009 00:44:14 +0000</pubDate>
		<dc:creator>hlegius</dc:creator>
				<category><![CDATA[Featured Articles]]></category>
		<category><![CDATA[OOP e Patterns]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[developer]]></category>
		<category><![CDATA[Programação]]></category>

		<guid isPermaLink="false">http://www.hlegius.pro.br/o-manual-por-favor/</guid>
		<description><![CDATA[É fato que ninguém nasce sabendo. Fato também que para evoluirmos é bem interessante ler, além de entender, saber separar as coisas e etc., mas a base é a leitura. A todo momento o pessoal fala isso nos fóruns: "leia isto, leia aquilo. Nossa, isso aqui é referência neste assunto". Vamos centrar mais no "nosso" [...]]]></description>
			<content:encoded><![CDATA[<p>É fato que ninguém nasce sabendo. Fato também que para evoluirmos é bem interessante ler, além de entender, saber separar as coisas e etc., mas a base é a leitura. A todo momento o pessoal fala isso nos fóruns: "leia isto, leia aquilo. Nossa, isso aqui é referência <em>neste</em> assunto".<br />
Vamos centrar mais no "nosso" mundo: você não sabe PHP, mas está interessado em aprender. O que você vai em busca imediatamente ? Referências, manuais e "apostilas", certo ? Seu objetivo com isto é aprender/conhecer algo que ainda não conhece.<br />
Qual é o pré-requisito para tal ? Saber ler, óbvio ! Por mais expressivo que um <strong>str_replace("foo","bar", $string);</strong> possa parecer, você precisa realmente entender o que acontece ou deixa de acontecer naquela parte.</p>
<p>Você deve estar se perguntando: aonde você quer chegar ?<br />
Simples: se tudo isso que citei é muito óbvio para você, meus parabéns ! Você deve ser um profissional preocupado com a documentação !</p>
<p>Sim, da mesma forma que você precisou ler para entender como funciona a API de reflexão nativa do PHP, o seu colega de projeto precisará ler a documentação daquele Webservice que você fez para o projeto.<br />
Partindo da minha analogia, seu amigo precisa ter como pré-requisito: saber ler e conhecimentos em PHP para poder implementar x)</p>
<p>Pensamento óbvio o meu, claro, claro que sim ! Mas pensa aí rapidinho: quantos códigos nos últimos tempos você pegou totalmente sem documentação, isso sem falar em outros aspectos, como qualidade interna e <em>blablablá</em> [no bom sentido] que profissionais aptos a escrever <em>grandes softwares</em> fazem [Se essa última palavra não faz sentido para você, recomendo ler <a href="http://www.amazon.com/Head-First-Object-Oriented-Analysis-Design/dp/0596008678/ref=pd_bbs_sr_6?ie=UTF8&#038;s=books&#038;qid=1235432837&#038;sr=8-6">este livro</a> para entender o que é um <em>grande software</em>]</p>
<p>Aquela velha <em>estória</em> de que quem manja mesmo lê o código <em>e já era</em> caiu por terra. Para um formmail até que pode ser, mas aplicações modularizadas com um modelo bem definido e aplicado e uma chuva de classes trabalhando neste modelo precisa muito mais do que uma simples leitura de código. O mínimo necessário são os comentários do tipo <a href="http://en.wikipedia.org/wiki/PHPDoc#DocBlock"><strong>DocBlock</strong></a> além dos comentários inline e por fim e não menos importante Classes, atributos, comportamentos, variáveis locais e constantes com nomes reais do que fazem, recebem ou são.</p>
<div class="igBar"><span id="lcode-2"><a href="#" onclick="javascript:showPlainTxt('code-2'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">CODE:</span>
<div id="code-2">
<div class="code">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&lt;?php</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#008000;">/**</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#008000;"> * Pretend this is a file</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#008000;"> *</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#008000;"> * Page-level DocBlock is here because it is the first DocBlock</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#008000;"> * in the file, and contains a @package tag</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#008000;"> * @package pagepackage</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#008000;"> */</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;define<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC0000;">"almost"</span>,<span style="color:#CC0000;">"Now the Page-level DocBlock is for the page, and the&nbsp; Define has no docblock"</span><span style="color:#006600; font-weight:bold;">&#41;</span>;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">?&gt; </div>
</li>
</ol>
</div>
</div>
</div>
<p>
Isto é um <strong>DocBlock</strong> <a href="http://en.wikipedia.org/wiki/PHPDoc#Page_Level_DocBlocks">retirado daqui</a> !</p>
<p>Para fechar, eu recomendo fortemente que você caso não conheça, dê uma boa olhada e claro, <a href="http://phpdoc.org/">passe lá</a> e pegue sua cópia gratuitamente dele, o <strong>PHPDoc</strong> em <a href="http://phpdoc.org/">PHPdoc.org</a>. Não vou me prolongar em explicar o que ele tem ou o que faz. O site está lá completinho.</p>
<p>Veja você mesmo <a href="http://manual.phpdoc.org/HTMLSmartyConverter/HandS/Smarty/Smarty.html">neste exemplo</a> online onde foi gerado o manual do Smarty Template. Ele por si só já diz tudo. Agora é com você <img src='http://programe.me/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://programe.me/o-manual-por-favor/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Indentação de códigos</title>
		<link>http://programe.me/indentacao-de-codigos/</link>
		<comments>http://programe.me/indentacao-de-codigos/#comments</comments>
		<pubDate>Wed, 27 Aug 2008 15:43:04 +0000</pubDate>
		<dc:creator>hlegius</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Organização]]></category>
		<category><![CDATA[developer]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[scripts]]></category>

		<guid isPermaLink="false">http://www.hlegius.pro.br/identacao-de-codigos/</guid>
		<description><![CDATA[É fato que cada programador tem suas técnicas e formas de trabalhar: preferências por Frameworks - ou preferência por trabalhar sem uma - preferências na plataforma (Linux, OSX, Windows, Solaris, *BSD...), preferências por IDEs de desenvolvimento (Eclipse, Zend Studio, Aptana, NetBeans, Kdevelop, Anjuta...) e isso não seria diferente quando o assunto é indentação de códigos. [...]]]></description>
			<content:encoded><![CDATA[<p>É fato que cada programador tem suas técnicas e formas de trabalhar: preferências por Frameworks - ou preferência por trabalhar sem uma - preferências na plataforma (Linux, OSX, Windows, Solaris, *BSD...), preferências por IDEs de desenvolvimento (Eclipse, Zend Studio, Aptana, NetBeans, Kdevelop, Anjuta...) e isso não seria diferente quando o assunto é <strong>indentação de códigos</strong>.</p>
<p>Pensando rapidamente parece um absurdo tratar sobre isto, mas acredite, assim como temos os Freetards - pessoas que têm amor ao Software Livre e critica todo o resto - Mactards, Wintards temos os programadores que <strong>descutem</strong> sobre indentação do código ! E acredite, tem "grupos" de programadores, cada qual defendendo um lado ! Loucura ? Continue lendo !</p>
<p><strong>Nosso ponto de partida..</strong><br />
Como eu não sei exatamente onde que teve inicio isto, tomaremos como ponto de partida a publicação do livro <em>The C Programming Language</em>, escrito por Brian Kernighan e Dennis Ritchie. No livro você percebe que eles indentam o código da seguinte forma:</p>
<p><img src='http://www.hlegius.pro.br/wp-content/uploads/2008/08/identacao_krstyle.png' alt='Kernighan and Ritchie Style Identing' /></p>
<p>Porém, há uma exclusão aí ! Quando temos funções, a indentação desta é diferenciada, veja:</p>
<p><img src='http://www.hlegius.pro.br/wp-content/uploads/2008/08/identacao_krstyle_function.png' alt='Kernighan and Ritchie - Function Style Identing' /></p>
<p>Repare que nestes casos, a abertura de chaves fica abaixo da linha que indentifica a função. Em todo o resto, a chave de abertura ficará na mesma linha.</p>
<p><strong>Nota:</strong> vale lembrar que a mesma dupla que definiu que <em>"Os nomes de variáveis e funções tem que expressar o significado do que ela armazena/executa, entretando o nome não pode ser extenso demais."</em></p>
<p><strong>Em desacordo, nascem outras formas...</strong></p>
<p><strong>1. Eric Paul Allman - "Allman Style"</strong><br />
Vejamos a forma que ele usa e defende(defendia) :</p>
<p><img src='http://www.hlegius.pro.br/wp-content/uploads/2008/08/identacao_allman.png' alt='Eric Allman Identing code' /></p>
<p>A explicação é clara, assim como o código: isso evita que tenhamos linhas cheia de "tabs" apenas com chaves lá no final. Uma vez que as chaves sempre ficariam antes do conteúdo do bloco de código. É, até que tem sentido...</p>
<p><strong>2. Whitesmiths Style</strong><br />
Esse estilo é usado pela <a href="http://www.symbian.com/">Symbian</a> ao desenvolver as aplicações em C++ para seus dispositivos móveis.</p>
<p><img src='http://www.hlegius.pro.br/wp-content/uploads/2008/08/identacao_whitesmiths.png' alt='Whitesmiths - Code Style' /></p>
<p>As chaves do bloco ficam abaixo da última letra do nome do método/construtor da linguagem. Ao que me parece, era usado nos primórdios do Windows também. (Carece de fontes confiáveis)</p>
<p><strong>3. GNU Emacs</strong><br />
Sim, o guru do Software Livre também entrou nessa e criou seu estilo. Ele nada mais é do que a mistura do Allman com a Whitesmiths.</p>
<p><img src='http://www.hlegius.pro.br/wp-content/uploads/2008/08/identacao_gnu.png' alt='Gnu Code Style' /></p>
<p>O código é indentado da seguinte forma: após o *if* você vai para linha debaixo e dá 2 espaços, e então coloca a abertura da chave do bloco. Vai para a linha debaixo novamente, e dê mais 2 espaços avançando dentro dos dois anteriores. Aí agora pode colocar seu código <img src='http://programe.me/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><strong>Analisando alguns códigos...</strong><br />
Vejamos alguns códigos por aí a fora para ver o que a galera acha "pop".</p>
<p><strong>- Código fonte Kernel do Linux (arquivo proc.c)</strong><br />
<img src='http://www.hlegius.pro.br/wp-content/uploads/2008/08/identacao_kernellinux.png' alt='Identação do Kernel do Linux' /></p>
<p><strong>- Código fonte Mozilla Firefox (GranParadiso Alpha8) (arquivo nsBrowserApp.cpp)</strong><br />
<img src='http://www.hlegius.pro.br/wp-content/uploads/2008/08/identacao_firefox.png' alt='Identação de código do Mozilla Firefox GranParadiso Alpha8' /></p>
<p><strong>- Código fonte The Vim Editor (arquivo edit.c)</strong><br />
<img src='http://www.hlegius.pro.br/wp-content/uploads/2008/08/identacao_vi72.png' alt='Identação de código do VI Editor 7.2' /></p>
<p><strong>- Código fonte Zend Framework 1.5 (arquivo Action.php)</strong><br />
<img src='http://www.hlegius.pro.br/wp-content/uploads/2008/08/identacao_zendphp.png' alt='Identação de código do Zend PHP Framework' /></p>
<p><strong>- E claro, a "minha" forma de indentação</strong><br />
<img src='http://www.hlegius.pro.br/wp-content/uploads/2008/08/identacao_hlegius.png' alt='Identação de códigos de hlegius' /></p>
<p><strong>Resumindo....</strong><br />
Pegando emprestado o resumo do <a href="http://www.emacswiki.org/cgi-bin/wiki/IndentingC#toc4">EmacsWiki.org</a>, temos:</p>
<blockquote><p>“gnu”<br />
    The default style for GNU projects<br />
“k&#038;r”<br />
    What Kernighan and Ritchie, the authors of C used in their book<br />
“bsd”<br />
    What BSD developers use, aka “Allman style” after Eric Allman.<br />
“stroustrup”<br />
    What Stroustrup, the author of C++ used in his book<br />
“linux”<br />
    What the Linux developers use for kernel development<br />
“python”<br />
    What Python developers use for extension modules<br />
“java”<br />
    The default style for java-mode (see below)<br />
“user”<br />
    When you want to define your own style</p></blockquote>
<p>Para fechar o post, deixo aqui uma frase que encontra-se no livro <em>The Programming C Language</em>:</p>
<blockquote><p>The position of braces is less important, although people hold passionate beliefs. We have chosen one of several popular styles. Pick a style that suits you, then use it consistently.</p></blockquote>
<p><strong>Veja também:</strong> (Links em inglês)<br />
<a href="http://www.emacswiki.org/cgi-bin/wiki/IndentingC">http://www.emacswiki.org/cgi-bin/wiki/IndentingC</a><br />
<a href="http://en.wikipedia.org/wiki/Symbian_OS">http://en.wikipedia.org/wiki/Symbian_OS</a><br />
<a href="http://en.wikipedia.org/wiki/Indent_style">http://en.wikipedia.org/wiki/Indent_style</a><br />
<a href="http://www.gamedev.net/community/forums/topic.asp?topic_id=446444">http://www.gamedev.net/community/forums/topic.asp?topic_id=446444</a></p>
]]></content:encoded>
			<wfw:commentRss>http://programe.me/indentacao-de-codigos/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>403day &#8211; Uma iniciativa arrogante em defesa da web</title>
		<link>http://programe.me/403day-uma-iniciativa-arrogante-em-defesa-da-web/</link>
		<comments>http://programe.me/403day-uma-iniciativa-arrogante-em-defesa-da-web/#comments</comments>
		<pubDate>Thu, 28 Feb 2008 17:37:22 +0000</pubDate>
		<dc:creator>hlegius</dc:creator>
				<category><![CDATA[Dia-a-dia]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[403]]></category>
		<category><![CDATA[anti-ms]]></category>
		<category><![CDATA[developer]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.hlegius.pro.br/403day-uma-iniciativa-arrogante-em-defesa-da-web/</guid>
		<description><![CDATA[Dia 04 de Maro de 2008 (4/03) um pessoal tem a idia de bloquear o acesso do browser Internet Explorer a nossos sites. Parece radical, talvez no adiante nada, mas eu irei fazer. Pode at parecer que estamos tirando o direto das pessoas escolher, mas, elas tm que saber que existem outros browser melhores, mais [...]]]></description>
			<content:encoded><![CDATA[<p>Dia 04 de Maro de 2008 (4/03) um <a href="http://403day.org/pt/">pessoal</a> tem a idia de bloquear o acesso do browser Internet Explorer a nossos sites.<br />
Parece radical, talvez no adiante nada, mas eu irei fazer. Pode at parecer que estamos tirando o direto das pessoas escolher, mas, elas tm que saber que existem outros browser melhores, mais estveis e mais seguros que o Internet Explorer.<br />
Depois dessa data, pretendo colocar no site um aviso aos usurios de Internet Explorer, recomendando a eles que tentem usar outros browsers. Ser um aviso exibido somente ao Internet Explorer e no prejudicar a navegao.</p>
<blockquote><p>A aplicao dos standards da web permite que os sites da web funcionem e se vejam correctamente em quase todos os navegadores (browsers). Tristemente, o Internet Explorer, o navegador com maior predominncia no mercado, apresenta as mais fortes e srias deficincias na implementao dos standards da web. Como consequncia destas deficincias, os programadores (developers) da web tm que desenvolver trabalho extra para garantir uma boa vivncia dos utilizadores deste navegador (browser). E isto custa dinheiro. E cabelo, muito cabelo.</p></blockquote>
<p>Mais informaes voc poder encontrar <a href="http://403day.org/pt/">diretamente no site</a> do "projeto"</p>
<p><a href="http://403day.org/pt/">http://403day.org/pt/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://programe.me/403day-uma-iniciativa-arrogante-em-defesa-da-web/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

