Programador especialista – a inércia em TI

Resolvi escrever sobre generalismo e especialização em desenvolvimento pois acho que é um debate interessante e os dois lados tem seus prós e contras. Meu perfil de gostar de aprender e desenvolver coisas diferentes me faz gostar mais do generalismo: me formei em design, sou desenvolvedor front-end no iG e gosto muito de desenvolvimento back-end, que exercito no And After, Eu Compraria e outros projetos pessoais.

Desde que entrei no iG estou em contato direto com NodeJS (leia como instalar o NodeJS no Ubuntu). Já tinha ouvido falar, tinha achado esquisito o conceito de javascript no back-end mas nunca tinha trabalhado com o Node, apesar da curiosidade.

Fiquei curioso e resolvi, antes de sair escrevendo código e aprender "na marra", me aprofundar mais em NodeJS, para isso corri para os tutoriais e li alguns ótimos livros:

  • What is Node?
  • The Node Beginner Book
  • Hands on NodeJS
  • Mastering NodeJS

Não terminei de ler todos os livros ainda, e também não fiz nenhuma aplicação em node, mas os livros me despertaram a curiosidade do debate desenvolvedor generalista vs desenvolvedor especialista. 

O Daniel Sperb já escreveu sobre formação generalista no design, e resolvi iniciar o debate no desenvolveimtno, o que é melhor: conhecer de forma um pouco mais rasa diversas linguagens e métodos ou se especializar em uma única linguagem ou método?

Brett defende a idéia (e me convenceu disso) de que é melhor conhecer diversas metodologias, linguagens e frameworks do que ser um especialista em uma única linguagem, método ou framework. Segue uma citação do livro:

"It's simply this: use different solutions for different problems. Even better, use the right solution for a particular problem"

É simplesmente isso: use diferentes soluções para diferentes problemas. Ainda melhor, use a solução certa para um problema específico.

Brett McLaughin, What is Node?

Eu comecei programando em PHP, fui para o ASP por causa de um emprego, voltei a programar PHP e aprendi o framework Code Igniter (que eu adoro) e graças ao Well estou aprendendo CakePHP agora, um outro framework PHP. Também estou estudando NodeJS, mas na verdade no iG sou desenvolvedor front-end: HTML5, CSS e javascript (com jQuery).

Especialista: tão focado em uma solução que pode não
visualizar nada em sua visão periférica.

Não defendo a idéia de apenas "arranhar" em uma dúzia de linguagens e não saber nenhuma direito, mas acho muito válido ter a mente aberta a novas tecnologias e idéias se aprofundar um pouco e dominar o básico de linguagem, e aí partir para fazer a mesma coisa em outra (ou em outro framework). Sei qunão é possível (e nem deve ser saudável) fazer isso com todas ou a maioria das linguagens, mas com algumas.

No CodeIgniter hoje eu me sinto a vontade para desenvolver qualquer coisa – mas o Well me apresentou algumas facilidades do Cake (bake e outras artimanhas para preguiçosos) que não sei se existe no CI, e essa é uma forma de "abrir a cabeça"  a novas idéias, talvez meu próximo projeto seja em Cake e não em CI, porque não?

A inércia no mundo de TI

A verdade é que, no geral, somos preguiçosos e reagimos negativamente a mudanças. Quem é empreendedor não pode agir desta forma, e os profissionais pró-ativos também não deveriam. As mudanças também são oportunidades: estar a frente tecnologicamente, aprender novas tecnologias, se promover, reduzir custos. 

A mudança pode trazer muitos benefícios, mas para isso você deve combater a inércia de deixar de fazer as coisas exatamente do mesmo modo que você fazia antes.

PHP resolve tudo? Talvez, com uma gambiarra aqui ou ali. E isso serve para qualquer outra linguagem, sei que um especialista faz o que quiser com a linguagem que domina, talvez com alguma deselegância no código aqui ou ali, mas será funcional.

"There's a certain inertia in not just web design, but all of programming. That inertia can be stated axiomatically like this: the more you learn, and become good at a certain approach or technique or language, the likely are you to use that (…) but this inertia often causes you to use a tool because you know ir, rather than beacause it's the right tool".

Brett McLaughin em What is Node?

É, de certa forma, natural esta inércia citada pelo Brett, mas é o motivo pelo qual as gambiarras acontecem.

 

Dificuldades do generalismo

Acho que o desenvolvedor generalista ainda tende a ser um pouco menos valorizado do que o especialista na "avaliação padrão" de junior, pleno e senior que o mercado faz. Não sei o quanto é valorizado alguem que domine diversas linguagens e metodologias e que não queira partir para a burocracia gerencial e queira continuar com a "mão na massa".

Outra dificuldade que vejo para o generalismo é se manter atualizado com as diversas tecnologias. Estudar e estar familiarizado com uma tecnologia é relativamente fácil: ler alguns livros, escrever algum código para testar e montar um projeto. Em menos de um ano, se você tem alguma experiência com outras linguagens, você já "se dá bem" com uma linguagem ou framework, mas e se manter atualizado em duas ou três linguagens? Acho que isso requer um pouco mais de estudo do que um programador que só le os últimos releases do PHP e do MySQL, por exemplo (com todo respeitos aos especialistas que se revoltarão com este texto).

Vantagens do especialista

Neste post explorei as vantagens que vejo no generalismo, quando você precisar de chegar em um ponto de conhecimento que o generalismo não proporcionou, você certamente vai penar um pouco mais que o especialista – e se isso se tornar constante em um projeto talvez seja hora de rever se não compensa contratar um especialista, no caso de não existir outra ferramenta (linguagem, framework, etc) que você domine que sirva para resolver o seu problema.

Sei que o especialista também tem suas vantagens sobre o generalista. Provavelmente a qualidade de código será um pouquinho melhor, talvez ele saiba explorar melhor ferramentas e bibliotecas específicas para cada situação, resultando em uma performance mais avançada, ou numa economia de servidor.

Para situações muito específicas ou de extrema performance, provavelmente um especialista também saiba como explorar melhor de forma exaustiva uma linguagem.

 

Quero a opinião dos leitores, você prefere ser um especialista ou generalista? E para contratar, acha mais vantagem contratar um especialista ou generalista? Porque?

 

Leia também:

PHP – Função com número de parâmetros indefinido

Para criar uma função que recebe um número variável de parâmetros precisaremos conhecer as funções built-in do PHP, func_num_args, func_get_args, e func_get_arg.

– func_num_args() – Retorna a quantidade de argumentos passados para a função
– func_get_args() – Retorna array de argumentos passados para a função
– func_get_arg(int $pos) – Retorna o argumento da posição informada
 
Exemplo:
 
function hello() {
	if (func_num_args() > 0) {
		$args = func_get_args();
		foreach($args as $arg){
			echo $arg;
		}
	} else {
		echo "Você não passou nenhum param";
	}
}
hello("andafter",".","org"); // Aparecerá "andafter.org"
hello(); // Aparecerá "Você não passou nenhum param" 

PHP, escovando bits

– "&" – Porta Lógica AND

Tabela da Verdade: 

A B A & B
0 0 0
0 1 0
1 0 0
1 1 1

 

Código: 

$a = 1;

$b = 0;

if($a & $b){

echo "Teste AND: true";

}else{

echo "Teste AND: false";

}

?>

Obs: Só será true se os valores de A e B forem 1

 

– "|" – Porta lógica OR

Tabela da Verdade: 

A B A | B
0 0 0
0 1 1
1 0 1
1 1 1

 

Código: 

$a = 1;

$b = 0;

if($a | $b){

echo "Teste OR: true";

}else{

echo "Teste OR: false";

}

?>

Obs: Só será true se os valores de A ou B ou ambos for(em) 1

 

– "^" – Porta lógica XOR

Tabela da verdade:

 
A B A ^ B
0 0 0
0 1 1
1 0 1
1 1 0

 

 

Código: 

$a = 1;

$b = 0;

if($a ^ $b){

echo "Teste XOR: true";

}else{

echo "Teste XOR: false";

}

?>

Obs: Só será true se o valor de A for o contrário de B e vice e versa.

 

– "~" – Porta lógica NOT

Tabela da verdade:

A ~A
0 1
1 0

Obs: O negado é o inverso do valor de A.

 

– ">>" – Move os bits para a direita

$num = 8; //Em binario, 1000

$num = $num >> 2; 

echo $num; //Aparecerá 2 que em binário = 0010

?>

 

 

– "<<" – Move os bits para a esquerda

$num = 2; //Em binario, 0010

$num = $num << 2; 

echo $num; //Aparecerá 8 que em binário = 1000

?>

Ponteiros, as variáveis de referência

Primeiramente precisamos entender o que é uma variável, então o que é? 

Variável é um nome amigável que damos para um espaço reservado na memória que receberá alguma informação que desejamos. Exemplo: 
 
$nome = "Andafter.org";
?>
 
Este trecho de código diz ao compilador do php o seguinte: Memória, reserve pra mim um espaço em sua memória e guarde dentro dele a string "Andafter.org". Quando pedimos isso, o computador executa essas ações e retorna um endereço que este espaço ficou alocado, o endereço de memória.
 
Sabendo agora o que é um endereço de memória, vejamos o código abaixo: 
 
$nome = "google.com"; 
$linkNome = &$nome;
$linkNome = "andafter.org";
 
echo $nome; //aparecerá andafter.org
?>
 
Na 1a linha de código temos uma associação normal, conforme vimos anteriormente.
na 2a linha de código falamos que $linkNome receberá o endereço de memória da variável $nome, ou seja, $linkNome será um ponteiro para a var $nome.
Na 3a linha modificamos a var $linkNome que na verdade é uma referência a variável $nome alterando assim o conteúdo da variável que está apontando.

Onde usar ponteiros? 

Ponteiros são usados juntos com funções, sendo estes em forma de parâmetros ou em retornos.
Exemplo:
 
$frutas = ["maça","pera","abacate"];
 
sort($frutas);
 
var_dump($frutas);
?>
 
A função sort, que ordena um array, recebe uma referência de variável e faz a modificação a partir da referência informada.
Veja a assinatura do método sort: 
 
bool sort ( array &$array [, int $sort_flags ] ) 

Porque usar ponteiros?

Os ponteiros evitam cópias desnecessárias para os escopos locais das funções. Toda vez que uma função recebe um parâmetro, ela mesma cria uma cópia da variável em memória para trabalhar dentro de si mesma, veja nos exemplos abaixo:
 
Exemplo 1: variáveis duplicadas em memória: 
 
 
function dobraValor($valor){
        return $valor * 2;
}
 
$valor = 2;
 
$valor = dobraValor($valor);
?>
 
Explicação: Neste exemplo teremos 2 variáveis $valor; uma de escopo global e uma de escopo local dentro da função ambas contendo o mesmo conteúdo.
 
Exemplo 2: uma variável e trabalhando com referência
 
 
function dobraValor(&$valor){
        $valor = $valor * 2;
}
 
$valor = 2;
 
dobraValor($valor);
?> 
 
Explicação: Neste caso, temos apenas 1 variável $valor, a de escopo global. A função dobraValor recebe apenas uma referência à variável de escopo global não criando portanto uma cópia da $valor para acesso local.

Conclusão

Deixamos mais performáticos nossos sitemas trabalhando com ponteiros mas também devemos tomar cuidado ao modificar essas variáveis por referência pois qualquer atribuição de valor a ela, modificaremos a variável de fora também o que pode gerar muita dor de cabeça na hora identificar o porque a variável está dobrando o valor sem vc. mandar. 

XAMP e MySQL no Mac – XAMPPErrorDomain error

Como tenho pouca experiência com Mac OS, quem configurou meu ambiente de desenvolvimento foi meu colega Well, que optoiu pelo XAMPP para a configuração do Apache e MySQL.

Hoje percebi que o MySQL não estava iniciando, e retornava o erro "XAMPPErrorDomain error 1", que pelo que pesquisei é um erro de permissão apenas.

 

XAMPPErrorDomain error 1

Não sei se esta mensagem de erro dá para outros casos, mas no meu caso ela representava um problema de permissão de execução nos arquivos do MySQL.

A solução foi dar um chmod -R 777 na pasta do MySQL do XAMPP:

sudo chmod -R 777 /Applications/XAMPP/xamppfiles/var/mysql

Pronto, agora é só iniciar o MySQL através do XAMPP Controle e ele deve funcionar corretamente.

 

phpMyAdmin

Vi que o MySQL estava com o processo rodando corretamente mas quando tentei acessar o phpMyAdmin recebi o seguinte erro: 

#1 - Can't create/write to file '/Applications/XAMPP/xamppfiles/temp/#sql274_1_2.MYI' (Errcode: 13)

Novamente problema de permissão de escrita na pasta indicada, outro chmod:

sudo chmod -R 777 /Applications/XAMPP/xamppfiles/temp

Problema resolvido, MySQL rodando e phpMyAdmin funcionando corretamente. Resolveu este problema de outra forma? Compartilha nos comentários para eu manter o post atualizado. 🙂