terça-feira, 30 de novembro de 2010

Vídeo: Todos nós queremos ser jovens (We all want to be young)

Mais um vídeo interessante, desta vez falando sobre aqueles que por décadas ditam tendências, mudam paradigmas e escrevem o futuro da civilização: Nós, os jovens.

O vídeo é resultado de um estudo realizado pela empresa BOX1824, que é especializada em tendências e comportamentos de consumo.

Obrigado a minha grande amiga Camila pela dica. Confira:

We All Want to Be Young (leg) from box1824 on Vimeo.

Vídeo: O que realmente nos motiva (The surprising truth about what motivates us)

Talvez este vídeo não seja novidade para você, mas caso você não tenha assistido e assim como eu trabalha em uma área que exige intelecto e criatividade, tenho certeza que irá gostar.

O vídeo traz uma palestra ministrada por Daniel Pink sobre seu livro "DRIVE - The surprising truth about what motivates us", que traz questões muito interessantes como: porque existem tantas pessoas trabalhando em projetos colaborativos sem receber um centavo em troca? Porque pagar um salário exorbitante para um funcionário não resulta em idéias mais criativas?

O vídeo dura cerca de 11 minutos e vale muito a pena mesmo de ser assistido. Não posso deixar de agradecer ao meu grande amigo Leonardo pela dica, confira:

quinta-feira, 25 de novembro de 2010

Criando VIEWS pelo phpMyAdmin em MySQL

Explicando a situação

Não quero introdução, mande-me direto ao ponto

Confesso que trabalhei um bom tempo sem saber da existência do conceito de uma VIEW (ou visões). Descobri isso poucos meses atrás, meus olhos brilharam quando eu entendi do que elas são capazes.

Até então sempre que eu precisava retornar informações de várias tabelas eu precisa criar as junções dentro da query no script php, ou pior, quando eu não estava com vontade nenhuma de colocar meu cérebro para trabalhar, eu esquecia totalmente do conceito de junções de tabelas e criava uma query para buscar cada informação de que eu precisava, era algo mais ou menos assim:


//Vamos buscar todas as compras
$sql = mysql_query('SELECT clientes_id, produtos_id, data_compra FROM compras');

while($dados = mysql_fetch_array($sql)){

 //Aqui eu pego o nome do cliente
 $sql_clientes = mysql_query('SELECT nome_cliente FROM clientes WHERE clientes_id ='.$dados['clientes_id']);
 $dados_clientes = mysql_fetch_array($sql_clientes);
 $nome_cliente = $dados_clientes['nome_cliente'];

 //Aqui eu pego o nome do produto
 $sql_clientes = mysql_query('SELECT nome_produto FROM produtos WHERE produtos_id ='.$dados['produtos_id']);
 $dados_produtos = mysql_fetch_array($sql_produtos);
 $nome_produto = $dados_produtos['nome_produto'];

 //Mostrando os resultados
 echo("Cliente: $dados_clientes[nome_cliente] - Produto: $dados_produtos[nome_produto] - Data da compra: $dados[data_compra]
");

}

Inegável que ela é totalmente ineficiente, mais lenta do que uma query com JOINs, além de mais trabalhosa, mas quando você tem recursos como o CTRL+C e CTRL+V disponíveis e tem que entregar tudo "pra ontem" é simplesmente mais simples e menos arriscado fazer isso, do que fazer JOINs que podem embolar o cérebro.

Abaixo a alternativa eficiênte, utilizando JOINs:


$sql = mysql_query('
 SELECT
  clientes.nome_cliente,
  produtos.nome_produto,
  compras.data_compra
 FROM `compras`
 LEFT JOIN clientes ON compras.clientes_id = clientes.clientes_id
 LEFT JOIN produtos ON compras.produtos_id = produtos.produtos_id

');

while($dados = mysql_fetch_array($sql)){

 echo("Cliente: $dados[nome_cliente] - Produto: $dados[nome_produto] - Data da compra: $dados[data_compra]
");

}

Com VIEWs podemos simplificar a história ainda mais e reduzir nosso bloco de código para algo assim:


$sql = mysql_query('SELECT cliente, produto, data FROM v_compras');
while($dados = mysql_fetch_array($sql)){

 echo("Cliente: $dados[cliente] - Produto: $produtos[nome] - Data da compra: $dados[data]
");

}

Bem mais simples certo? Mais ou menos, pois para que isso seja possível, teremos que criar a VIEW no nosso banco de dados, digamos que ela vai fazer o trabalho sujo e facilitar nosso trabalho durante o desenvolvimento.
Em uma situação ideal, quem faria isso seria um DBA, o que tornaria ainda mais simples a vida do programador, mas como esta não é a realidade de muitos, inclusive da minha, teremos que criar a VIEW nós mesmos.

Utilizando o phpMyAdmin para criar nossas VIEWS

Antes de mais nada espero que você já esteja com seu phpMyAdmin aberto, se não tiver por gentileza abra-o.

  1. Clique em uma tabela qualquer;
  2. No canto inferior da página, procure por "Operações resultantes da consulta" ou "Query results operations" para quem utiliza o phpMyAdmin em inglês, clique onde diz CREATE VIEW;
  3. Você será apresentando a um formulário pedindo para inserir algumas informações para criar a VIEW, neste caso o que nós apenas teremos que informar será:
    • Nome da VIEW
    • Campos da VIEW
    • Query da VIEW
  4. Escolha um nome para ela, convencionalmente eu utilizo v_nome_da_tabela_original, para distingui-las melhor em relação as tabelas originais;
  5. Defina os nomes das colunas da view, utilize vírgulas para separá-las;
  6. Por último, crie a query que fará a seleção dos valores que queremos que a VIEW nos retorne.

Seguindo nosso exemplo, ficaria algo assim:

Nome: v_compras
Colunas: id,cliente,produto,data
Query:
 SELECT
  clientes.nome_cliente,
  produtos.nome_produto,
  compras.data_compra
 FROM `compras`
 LEFT JOIN clientes ON compras.clientes_id = clientes.clientes_id
 LEFT JOIN produtos ON compras.produtos_id = produtos.produtos_id

Como você pode notar, a query que a gente utilizou aqui, foi a mesma do nosso segundo exemplo.
Feito isso, é só confirmar e começar a usufruir de sua criação.

Utilizar este recurso de banco de dados pode trazer diversas vantagens bem como desvantagens, não vou entrar em muitos detalhes, mas vamos dar uma olhadinha rápida nessas questões:

Algumas vantagens das VIEWs

  • Restringir acesso aos dados de uma tabela a apenas alguns usuários;
  • Combinar dados de várias tabelas em uma única VIEW (conforme nosso exemplo)
  • Menos retrabalho
  • Melhorar a performance de acesso aos dados
  • Mais segurança

Desvantagens das VIEWs

  • VIEWs muito complexas podem acabar exigindo muito processamento, tornando-se lentas;
  • Para atualizar uma VIEW, na maioria dos casos é necessários efetuar um DROP, atualizar a query e recriar a VIEW.

Se você tiver mais interesse em aprender sobre este assunto, achei um link bem interessante e completo que pode agregar em muito seu conhecimento: TWiKi - Lição Visões.

É isso aí, até mais!

terça-feira, 23 de novembro de 2010

Framework? Não sei nenhuma e agora?

Em desenvolvimento web, utilizar uma framework geralmente é o melhor caminho para entregar um projeto em menos tempo e com mais qualidade, isso é fato.

Sempre tive curiosidade e vontade de aprender a utilizar uma, mas a única que eu me
aventurei por um tempo foi a framework Django, utilizando a linguagem Python.

Confesso que estava gostando, mas tive que voltar a trabalhar e interrompi o aprendizado, aliás, este sempre foi o motivo de eu não aprender uma framework: ter que trabalhar em projetos pequenos e com prazos "pra ontem", não sobrando muito tempo para se dedicar à algo desse porte. Então como o tempo é curto, procuro aprender várias coisas que exigem menos tempo de dedicação e que agreguem ao meu trabalho.

Graças a esse modelo aprendi muita coisa sozinho: Ajax, Jquery, Json, PDO, SEO, além de diversas técnicas de CSS. Ter esses conhecimentos ajuda muito, posso dizer com segurança que tenho plena capacidade de escrever meus próprios plugins e "fuçar" nos dos outros, não ficando dependente de soluções de terceiros.

Claro que tenho plena consciência dos problemas de não utilizar uma framework, bem como um sistema de templates e não utilizar MVC. Acredite, o que eu mais peguei na vida foi código estilo macarrão, confesso que em alguns eu até aprendi algumas coisas novas, mas na maioria dos casos eles apenas fizeram eu querer sair correndo e devolver o dinheiro que me pagaram.

Seguindo a filosofia Rambo, de se virar como puder (MacGyver deve compartilhar esta mesma filosofia), resolvi criar meu próprio método de desenvolver, do qual me sinto confortável e satisfeito. O melhor dele, é que a única coisa mais próxima de uma framework que vou precisar, é o Jquery. Falo isso porque ele é considerado mais como uma biblioteca JavaScript, do que uma framework.

Outro fato que me traz satisfação neste método, é que eu não vou utilizar um sistema de templates para criar o visual, o próprio arquivo html será meu template, então não vou ter que aprender mais uma sintaxe especial de um sistema de templates informando para meu php o que ele precisa fazer lá.

A estrutura ficaria a seguinte:

MODELVIEWCONTROLS
MySQL / PDOHTML / CSSPHP / JavaScript (Json/Jquery)

  • Primeiramente eu trabalho o layout da aplicação, utilizando o HTML e CSS, resultado é todo o front-end do sistema.
  • Segundo lugar eu modelo e escrevo minhas classes, com as regras do negócio, persistência de dados e etc.
  • Por último, utilizo JSON e JQuery para interligar os pontos.

Oficialmente, não sei se esta é uma boa maneira de se trabalhar, mas foi a melhor que eu consegui, considerando que muitas vezes eu tenho que acumular os trabalhos de: designer, analista, programador front-end e back-end.

Quem sabe PHP tem que entender de HTML, quem entende de HTML tem de entender de CSS e JavaScript, Jquery é extremamente fácil de aprender e muito bem documentado e com um pouco de esforço extra, você também aprende JSON. Aprender orientação ao objeto e PDO é questão de gosto, mas eu recomendo, pois facilita muito o desenvolvimento e manutenção.

Enfim, para aqueles que não se empolgam tanto com uma framework ou não tem tempo para investiver no aprendizado de uma, acredito que esta seria uma boa forma de trabalhar, ao menos para mim, ela funciona.

Grande abraço e até uma próxima.

sexta-feira, 19 de novembro de 2010

Não esqueça do HTML

Quando eu fiz o curso técnico na área de informática tive uma ou duas aulas sobre HTML, na verdade, no currículo do curso esta matéria nem existia e o que estávamos aprendendo era PHP Básico, claro que é raro encontrar um curso em que uma tecnologia é abordada a fundo, na maioria das vezes é algo inviável. O ponto é, essas duas aulas de HTML me mostraram muito pouco sobre o assunto e eu sai de lá achando que HTML era uma linguagem de programação, apenas meses mais tarde eu descobri que ela na verdade era uma linguagem de marcação, só fui entender mesmo um pouco mais e o quanto um HTML bem estruturado é importante a pouco mais de um ano, sendo que trabalho com desenvolvimento a três anos.

Resumindo, passei dois anos da minha vida profissional de desenvolvedor considerando o HTML algo secundário, aprendi outras tecnologias, me aprofundei em algumas que já conhecia, e o HTML nada. Agora vamos pensar um pouco, navegadores entendem HTML, eles não processam linguagens lado servidor (PHP, ASP, Python, etc), eles processam HTML, processam folhas de estilos e scripts porque também rodam no lado do cliente, mas se você olhar a fundo, verá que tudo em uma aplicação web parte de alguma tag HTML, então quem é secundário nesta história toda? Certo que não é o nosso querido HTML.

Não conheço o mundo todo, mas conheço alguns outros programadores, alguns deles já me deram dicas preciosas sobre PHP, CSS ou banco de dados MySQL, mas nenhum deles me falou algo do tipo:

“Cara, porque você ta usando <h2> (título nível 2) no meio de um texto dentro de uma tag <p> (parágrafo)? Ah! Entendi, é porque ela deixa em negrito, mas seguinte, que tu acha da minha sugestão? Utiliza a tag <strong>, você quer informar ao navegador que esta palavra tem um contexto maior dentro do texto, então usa ela. O <h2>, representa um sub-título de uma página, use-o somente para este fim, os robôs de indexação de conteúdo agradecem.”

Óbvio que eu ficaria confuso e ficaria me perguntando o porque não posso utilizar um <h2> ao invés de um <strong>, se ambos deixam minhas palavras em negrito.
Para os mais entendidos do assunto isso tem uma explicação bem simples, não vou me aprofundar nela agora, pois não quero perder o foco deste artigo, mas se tiver curiosidade, começa a estudar um pouco de SEO (Search Engine Optimization) que você irá descobrir o porque HTML não pode ser considerado algo secundário.

Interoperabilidade é uma palavra que deve se tornar cada vez mais ouvida no mundo web, ser capaz de criar conteúdo que possa ser apresentado em diferentes dispositivos de maneira eficiente, se torna algo cada vez mais mandatório em nossa área e conhecer um pouco mais a fundo sobre essa tal linguagem de marcação chamada HTML, é um dos grandes pontos chaves para atender estas expectativas do mercado.

Para finalizar, caso você ainda não tenha muita experiência com HTML, resolvi criar uma lista com itens interessantes a serem estudados sobre o assunto. Divirta-se:

  1. Procure conhecer a diferença entre HTML e XHTML;
  2. Entenda o que é DHTML, DOM e os elementos de um documento HTML
  3. Estude sobre SEO, conheça algumas técnicas e se for desenvolvedor procure conhecer bem a importância do correto uso das tags
  4. Aprofunde seu conhecimento em CSS, saiba do que ele é capaz e como ele pode ser utilizado para diminuir significativamente as linhas de código de um documento HTML
  5. Comece a criar curiosidade sobre o HTML 5, apesar dele estar meio longe de se tornar padrão (HTML 4 demorou quase 10 para chegar em seu ápice), vale a pena conhecer o que a W3C esta preparando e como isso vai mudar nossas vidas.

terça-feira, 16 de novembro de 2010

Tutorial: Utilizando a classe Paging para criar uma paginação simples e rápida

No post "Paginação simples e rápida em PHP utilizando a classe Paging" foi apresentado a classe Paging, para criar paginação de dados tabelados.

Neste post, vamos ver passo a passo como fazer para utilizar os recursos desta classe e vamos construir um pequeno sistema de visualização de registros com as funções mais comuns esperadas de um recurso como este.

Arquivos necessários

Utilize o link abaixo para fazer o download dos arquivo necessários, esta tudo compactado em um arquivo zip, no total são cinco arquivos, iremos ver cada um deles a partir de agora.

produtos.sql

Execute o conteúdo deste arquivo no seu servidor mysql. Todo este exemplo é trabalhado baseando-se nos registros deste banco. Fique livre para usar qualquer outra tabela caso não queira poluir seu banco de dados com este sql. :)

paging.css

Utilizado para dar uma "floreada" em nossa tabela, aplicando alguns estilos.

connection.class.php

Utilizaremos este arquivo para fazer a conexão com o banco de dados.


  1. Abra o arquivo e altere os valores destacados em negrito, utilizando os dados de acesso ao seu banco de dados:

    private $dsn = 'mysql:dbname=paging;host=localhost';
    private $user = 'root';
    private $pass = '';
  2. Depois de alterado, pode salvar e fechar o arquivo, não iremos mais mexer nele.

paging.class.php

Este é o arquivo que faz toda a mágica. Você não precisa mexer em basicamente nada nele, a não ser que queira personalizar, fique a vontade para realizar as mudanças que julgar necessário.

exemplo_simples.php

É neste arquivo que iremos utilizar a classe Paging.

  1. Abra o arquivo e procure pelas linhas:
    1. require_once('paging.class.php');
    2. $paging = new Paging();
    3. $paging->table('produtos');
    4. $paging->labels('ID,Nome,Tipo, Descrição');
    5. $paging->fields('id,nome,tipo,descricao');
    6. $paging->rowsperpage(10);
    7. $paging->page(isset($_GET['p']) ? $_GET['p'] : 1);
  2. Nas primeiras duas linhas nos apenas incluímos a classe Paging e criamos uma instância do objeto Paging. Até aqui nada demais.
  3. Na linha "$paging->table('produtos');", nós informamos ao objeto, qual a tabela dentro do banco de dados, que queremos que os registros sejam retornados.
  4. Na linha "$paging->labels('ID,Nome,Tipo, Descrição');", utilizamos o método labels( ) para definir quais serão os valores do cabeçalho da tabela. Os valores que forem colocados ali, ficarão dentro das tags <th> da tabela. Utilize vírgulas para separar os valores.
  5. Na linha "$paging->fields('id,nome,tipo,descricao');", temos um método bem semelhante: fields( ), aqui você precisa informar quais são as colunas que terão o conteúdo retornado da tabela. Assim como no método labels( ), utilize vírgula para separar os valores.
  6. Na linha "$paging->rowsperpage(10);", temos o método rowsperpage( ), aqui você definirá o número máximo de registros que serão mostrados em cada página.
  7. Na linha "$paging->page(isset($_GET['p']) ? $_GET['p'] : 1);", temos o método page( ). Vamos passar como parâmetro o valor da página atual, informando ao objeto, de qual página queremos que ela retorne os registros. A classe Paging, utiliza a variável $_GET['p'] como padrão, portanto deixe ela reservada para a classe, caso precise mudá-la, você terá que fazer isso manualmente no arquivo paging.class.php. Como geralmente na primeira visualização da página, a variável $_GET['p'] não esta definida, nós utilizamos um "if inline" para validá-la.

Até aqui, o que nós apenas fizemos, foi configurar nosso objeto com alguns parâmetros, nada é mostrado em tela até então. Vamos ver como isso é feito:

  1. Procure pelas linhas:
    1. <div id="All">
    2. <div id="Table"><?php $paging->show_table(); ?></div>
    3. <div id="Paging"><?php $paging->show_controls(); ?></div>
    4. <div id="Pagecount">Página: <?php echo($paging->i_page) ?> de <?php echo($paging->pages_count())?></div>
    5. </div>
  2. Vamos ignorar a explicação das divs neste exemplo, elas são praticamente auto-explicativas e servem basicamente apenas para organizar o conteúdo.
  3. Na segunda linha, utilizamos mais um método de nossa classe: show_table( ), como o nome da a entender, é ele quem imprime na tela os registros recuperados.
  4. Logo abaixo, utilizamos mais um importante método, o show_controls( ), é ele quem mostrará os controles de navegação das páginas. Por padrão este método irá sempre mostrar até 5 links com páginas para o usuário navegar, mas caso você queira alterar este valor, utilize o método link_limit( ), e informe um novo valor para o objeto.
  5. Por último, temos na penúltima linha, o uso de mais um método pages_count( ), ele nos permite retornar o número de páginas encontradas pela classe, e com isso nós conseguimos mostrar ao usuário um status da navegação dele pelas páginas.

Se você conseguiu rodar localmente este exemplo, você deve estar vendo algo parecido com a imagem abaixo:

Bom, por hoje é só, espero que tenham apreciado o exemplo. Fiquem livre para comentar, tirar dúvidas ou dar sugestões. Até breve!

Paginação simples e rápida em PHP utilizando a classe Paging

Apesar de ser um assunto muito abordado em outros sites e blogs, resolvi postar aqui a minha abordagem de paginação em PHP. Se trata de uma classe, que com algumas poucas linhas de código, pode ser configurada para mostrar dados tabelados, com um painel de navegação entre páginas, semelhante ao utilizado no site da google.com.

Imagem demonstrativa


Exemplo de utilização

  1. Crie uma instância da classe
    require_once('paging.class.php');
    $paging = new Paging();
  2. Defina os parâmetros (atributos) principais
    $paging->table('produtos');
    $paging->labels('ID,Nome,Tipo, Descrição');
    $paging->fields('id,nome,tipo,descricao');
    $paging->page(isset($_GET['p']) ? $_GET['p'] : 1);
  3. Mostre os resultados: a tabela com os registros e controles de navegação
    $paging->show_table();
    $paging->show_controls();

Confira mais exemplos


Arquivos

Utilize o link abaixo para fazer o download dos arquivo necessários, esta tudo compactado em um arquivo zip, no total são dois arquivos, um é a classe connection.class.php, que você deve configurar com os dados de acesso para um banco de dados e o outro arquivo é o paging.class.php, responsável por criar a paginação. Caso tenha dúvidas de como proceder, confira os tutoriais disponíveis nos links acima.

Documentação

Abaixo você pode conferir a documentação da classe paging, com a lista de atributos e métodos disponíveis.

Atributos


NomeTipoModificadorDescrição
s_tableStringPublicNome da tabela do banco em que o objeto irá operar.
s_fieldsStringPublicLista de campos(colunas) da tabela que deverão ser retornadas (separados por vírgulas).
s_labelsStringPublicLista com os valores que serão apresentados nas colunas do cabeçalho da tabela (separados por vírgulas).
s_whereStringPublicClausúla 'Where', caso ouver, senão poderá ser deixada em branco e assumirá '1' (tudo) na hora de realizar a query.
s_orderbyStringPublicNome da coluna que irá ser utilizada para ordenar os registros. Assume 'id' como padrão, caso não seja informada.
s_orientationStringPublicOrientação dos registros Ascendente 'ASC' ou Descendente 'DESC'.
i_rowsperpageIntegerPublicNúmero de registros mostrados por página. Se não for informado, assumirá 50 por padrão.
i_pageIntegerPublicPágina atual utilizada para a leitura dos registro. O padrão é 1, ou seja, primeria página.
i_link_limitIntegerPublicLimite de número de links de páginas mostrados no painel de navegação da paginação. Assume 5 caso não seja informado.
a_columnsArrayPublicArray responsável por armazenar as colunas inseridas manualmente.
a_cols_widthArrayPublicArray com os tamanhos das colunas do grid.

Métodos

NomeRetornaModificadorDescrição
table(String)NullPublicMétodo set, utilizado para definir a propriedade 's_table'
fields(String)NullPublicMétodo set, utilizado para definir a propriedade 's_fields'
labels(String)NullPublicMétodo set, utilizado para definir a propriedade 's_labels'
where(String)NullPublicMétodo set, utilizado para definir a propriedade 's_where'
orderby(String)NullPublicMétodo set, utilizado para definir a propriedade 's_orderby'
orientation(String)NullPublicMétodo set, utilizado para definir a propriedade 's_orientation'
rowsperpage(Int)NullPublicMétodo set, utilizado para definir a propriedade 'i_rowsperpage'
page(Int)NullPublicMétodo set, utilizado para definir a propriedade 'i_page'
link_limit(Int)NullPublicMétodo set, utilizado para definir a propriedade 'i_link_limit'
total_rows()IntegerPublicRetorna o número total de registros encontrados, baseando-se nos atributos(s_fields,s_where) passados para o objeto.
pages_count()IntegerPublicRetorna o número total de páginas.
thead()ArrayPrivateRetorna um array com as células utilizados no cabeçalho da tabela. Usada apenas internamente pela classe.
cells()ArrayPrivateRetorna um array com os campos que deverão ser retornados do banco de dados. Usada apenas internamente pela classe.
page_scale(Int, Int, Int)ArrayPrivateCria uma escala numerada de páginas, avança na escala conforme o número da página atual informado, mantendo sempre números iguais de páginas anteriores e próximas a atual. Usada apenas internamente pela classe.
show_table()NullPublicEscreve na tela a tabela com os registros recuperados.
show_controls()NullPublicMostra o painel de controle da paginação, com os links: ('Primeira','Anterior','Escala numerada','Próxima','Última'). Aqui existe um pequeno porém, caso o número de registros por página seja insuficiente para criar mais do que uma página, então os controles não serão mostrados, resumindo: 1 página = nenhum controle, 2 páginas ou mais = mostra controles.
add_column()NullPublicPermite adicionar manualmente colunas no grid.
cols_width()NullPublicPermite ajustar o tamanho das colunas do grid.
É isso aí, espero que tenham apreciado, qualquer dúvida, critica ou sugestão por favor deixe um comentário, irei responder assim que possível.

segunda-feira, 15 de novembro de 2010

Programação Orientada a Resultados

Na área de desenvolvimento é comum se falar de paradigmas: procedural, orientado a objeto, orientada a aspecto e por aí vai.
Independente do paradigma utilizado, existe uma constante que rege não apenas nossa área de trabalho, como qualquer outra: "Precisamos entregar resultados".

Muita gente, a medida que este blog for crescendo, vai discordar de muita coisa que eu postar aqui, porque não defenderei padrões de desenvolvimento, frameworks ou qualquer outro conceito comumente utilizado na área, minha visão será sempre focada em resultado.

Se utilizar tal framework vai entregar o resultado de que precisa, então beleza, use-a. Se utilizar um sistema de templates será bom para o projeto, perfeito, mas se você preferir fazer tudo na munheca e demorar alguns dias a mais para fazer um trabalho, não se martirize por isso.

A visão é simples, existe muita tecnologia no mercado, muitos padrões, tendências e exigências, para ser um desenvolvedor, exigem um currículo extenso, com inúmeros conhecimentos, porém, esse é uma realidade muito volátil, conhecer uma Zend Framework em um lugar pode não significar mais do que criar um script todo procedural que resolveu um problema de anos dentro de uma empresa.

Lógica é importante, conhecer a linguagem e não apenas sua sintaxe é importante, com esses dois itens somado a força de vontade de aprender e uma dose de oportunidade você é capaz de utilizar qualquer tecnologia encontrada no mercado, mas mais importante do que saber um punhado de tecnologias que os outros querem que você saiba, é ter satisfação naquilo que você faz, com isso você entrega resultado, que é o que toda empresa quer e a tecnologia será meramente secundária.

Para finalizar, muitos mas muitos desenvolvedores não irão compartilhar de minha visão, irão dizer que eu não sei nada de programação, que provavelmente sou um amador, não discordarei, realmente, se for analisar em todo um contexto, tenho muito a aprender, mas acredito que também tenho com o que contribuir, se algo que eu postar aqui estiver errado, ou pudesse ter sido escrito melhor, por favor contribua positivamente com sua crítica e sugestão de melhoria, afinal quem toma a liberdade de criticar é porque tem a plena capacidade de fazer melhor.

Seja bem-vindo!