As diferenças de ser um Usuário da linguagem e um Especialista da linguagem
Hoje vamos falar sobre um tema que pode ser um pouco polêmico, mas que é sempre bom colocá-lo na mesa.
Se você for pesquisar sobre ser um especialista ou ser um generalista da linguagem, vai ter várias pessoas que terão opiniões diferentes sobre este tema.
No livro O Programador Apaixonado de Chad Fowler, publicado em 2009, ele comenta sobre ser um “generalista” e logo depois como ser um “especialista”. Com um pequeno resumo dos dois capítulos, vamos entender o que ele queria dizer na época em que o livro foi lançado e que até hoje faz sentido.
- Seja generalista
A barreira entre o negócio e TI deve ser derrubada já! Comece a entender como sua empresa funciona. Não se limite a conhecer somente o que você faz, tente entender o processo como um todo.
Liste as dimensões em que você pode ou não estar generalizando seus conhecimentos e habilidades. Para cada dimensão, escreva sua especialidade. Por exemplo, se “sistema operacional” é uma de suas dimensões, você pode escrever Windows/.NET ao lado. Agora, à direita da sua especialidade, escreva um ou mais tópicos que você deveria aprender. Não leia somente, faça na prática. - Seja especialista
Ser um especialista não significa que você não deva conhecer outras áreas. Ser especialista significa que você conhece outras áreas, consegue dar uma opinião ou trabalhar nela, mas quando o assunto é especifico naquilo que você tem conhecimento, você terá sempre a resposta.
Se aprofunde na linguagem que você utiliza, tente entender como ela é compilada, como sua VM (se tiver) trabalha com o código. Como funciona a importação das bibliotecas, como o seu compilador, sistema operacional, ou máquina virtual liga vários pedaços de código para formar um sistema coerente. Encontre uma oportunidade para dar aula de algo que você gostaria de se aprofundar.
O autor comenta sobre você ser um generalista, ou seja, você buscar conhecer não só a área que você trabalha, mas conhecer o processo inteiro. E também sobre você listar dimensões que você pode generalizar ou se especializar em seus conhecimentos e suas habilidades. E logo depois, na parte de ser um especialista, ele diz que ser um especialista é você conhecer outras áreas ou outras linguagens, ou seja você vai saber dar uma opinião ou trabalhar nela, porém se o assunto é o da sua especialidade, você sempre terá a resposta.
A conclusão que eu tiro deste tema, é que devemos ser os dois. Você é especialista em Java? Ótimo, então deixe de ser um usuário dessa linguagem e se aprofunde para entender das coisas mais básicas até as coisas avançadas, faça certificações, faça cursos e estude bastante. Porém, nada impede de você conhecer Javascript, Python, Go, C# e assim por diante e ter um pequeno domínio sobre essas linguagens. Isso provavelmente será ótimo para sua carreira.
Usuário da linguagem x Especialista da linguagem
Em um exemplo prático, quando você usa o Excel para criar tabelas, gráficos, somar, dividir, etc., você está sendo apenas um usuário dessa ferramenta. Porém, se você se aprofundou o bastante em seus estudos, fez cursos, aprendeu a como “programar” no Excel, soube como criar macros e tudo mais, você deixa de ser um usuário da ferramenta e passa a ser um “dominador” da ferramenta e coloca ela para trabalhar a seu favor.
A mesma coisa acontece na linguagem de programação, quando você começa a aprender e estudar uma nova linguagem, nós somos nada mais, nada menos, que “usuários” da linguagem, pois o tutorial ou o curso está falando para fazer isso e aquilo, e às vezes você usa uma coisa que nem sabe porque está usando. Faz sentido, pois você está aprendendo ela, e com o tempo você vai conhecer mais coisas da linguagem e se tornar mais experiente.
Porém, o que acontece é que nos enganamos muito, pois nem sempre se você trabalha com a linguagem há 3/5/10 anos você é um especialista nela.
Se você passar 10 anos usando a linguagem no modo automático de quando você aprendeu, se você não se aprofundar, não procurar entender os detalhes, você vai continuar sendo um usuário da linguagem.
Quando você se aprofunda na linguagem e torna-se um especialista, consegue escrever códigos melhores e mais performáticos. É claro que saber 100% da linguagem é uma coisa extremamente difícil e quase impossível, mas você entender a fundo os porquês de quando e o que usar em cada caso, você já estará indo para o caminho correto.
Chega de teoria e vamos para a prática
Pegando um pouco mais para o lado prático, irei dar alguns exemplos relacionado a linguagem Java.
Você que trabalha com Java, já se deparou alguma vez com a situação abaixo?
List<Integer> numbers = new ArrayList<Integer>();for (int i = 0; i < 10; i++) {
numbers.add(i);
}
Essa conversão automática em que o array de Integer (Wrapper class) consegue adicionar um tipo primitivo int é chamado de Autoboxing e que foi implementado no Java 5. Também tem o Unboxing, que seria o inverso dessa conversão.
Integer a = new Integer(4);int b = a;
Esse mecanismo que foi adicionado é uma mão na roda, e deixa o código bem mais clean, não é mesmo? Mas nem tudo são flores…
Abusar do Autoboxing e do Unboxing podem afetar o desempenho do código, como também causar exceções NullPointerException e também causar problemas com comparações e operações aritméticas. Então, como a própria documentação do Java diz, você deve saber quando e onde usar os tipos primitivos e as Wrapper Classess.
Quando usar tipos primitivos:
- Ao fazer uma grande quantidade de cálculos, os tipos primitivos são sempre mais rápidos — eles têm muito menos sobrecarga;
- Quando você não quer que a variável seja nula;
- Quando você não deseja que o valor padrão seja nulo;
- Se o método deve retornar um valor;
Quando usar a Wrapper Class:
- Quando você está usando coleções ou genéricos — é obrigatório;
- Se você deseja obter o MIN_SIZE ou MAX_SIZE de um tipo;
- Quando você deseja que a variável possa ser nula;
- Quando você deseja que o valor padrão seja nulo;
- Se às vezes o método pode retornar um valor nulo;
Esse foi apenas um exemplo dado, porém poderíamos ter vários outros do tipo: quais as diferenças entre as classes String, StringBuilder e StringBuffer, entender sobre a JVM, entender o que são objetos mutáveis e imutáveis, o que são exceções checked e unchecked, quando usar ArrayList ou LinkedList, etc. Alguns desses exemplos que eu dei que parecem simples, porém saber a fundo as diferenças e quando usá-las é o que vai te fazer deixar de ser um usuário da linguagem, e ir se tornando um especialista dela.
A perfeição é feita de pequenos detalhes, não é apenas um detalhe. — Michelangelo
Seja um entusiasta independente da linguagem que você utiliza.
O que achou do post? Deixe seu comentário ou seu like :-)