Classificação dos desenvolvedores de artes marciais

Como os desenvolvedores são chamados


No meu blog, uso os termos "programador", "codificador", "desenvolvedor" e "engenheiro" de forma intercambiável para evitar tautologia. No entanto, acredito que existem algumas diferenças entre essas palavras e outras semelhantes.

Neste artigo, discutiremos um conjunto de substantivos típicos para designar uma pessoa que escreve código. Darei minha interpretação de como esses termos se relacionam com o nível de domínio.

Interpretação de valores


As definições apresentadas aqui não são oficiais. Não conheço nenhuma definição formal ou padrão aceito. No entanto, muitas pessoas têm uma opinião forte sobre esse assunto. Meu entendimento de cada termo é baseado em 30 anos de experiência na indústria de software, mas estou absolutamente preparado para que outras pessoas discordem de minha interpretação.

Eu não quero discutir ou convencer as pessoas com uma opinião diferente. Em geral, dificilmente é possível falar de uma opinião certa ou errada. No entanto, se você ainda não formou uma posição sobre esse assunto, espero que este guia traga alguma clareza.

Abordagem tripartida


Para maior clareza, cada termo receberá três características:

1. Nível de domínio


Uma descrição do nível de habilidade para este termo, na minha interpretação.

2. Paralelamente às fileiras das artes marciais


Uma analogia com as fileiras das artes marciais. Em particular, comparamos o nível técnico de habilidades com as cores dos cintos dos artistas marciais.

3. Código de exemplo


Um exemplo de como uma pessoa desse nível deve abordar uma tarefa simples de programação. A definição aqui é trivial e não foi concebida como um exemplo realista. O objetivo é comparar e discutir os níveis de habilidade. Por simplicidade, o exemplo é selecionado para atender a um especialista de qualquer nível. Aqui está o problema que consideraremos:

Calcular a soma dos números inteiros

Por favor, brinque comigo e apresente essa tarefa como intermediária para muito mais difícil. Em nosso universo ficcional, uma tarefa requer reflexão séria e possui muitas soluções e abordagens em potencial. Imagine que este é o módulo central do sistema que você deseja dimensionar.

Usarei Ruby para exemplos triviais de implementação. O código é bastante simples: é compreensível, mesmo que você não conheça o Ruby.

3. Lista


Substantivos discutidos:

  • Novato
  • Codificador
  • (Hacker)
  • Programador
  • Pesquisador (cientista da computação)
  • Desenvolvedor de software
  • Engenheiro de software
  • Arquiteto de software

Então, vamos começar.

Cintos de artes marciais




Quando morei na Itália na minha juventude - cerca de 20 kg atrás - pratiquei judô e kung fu por vários anos. Aprendi então que em muitas artes marciais o nível de habilidade corresponde à cor do cinto. Normalmente, a cor muda de branco para preto, onde o nível de experiência corresponde à escuridão do cinto.

Um iniciante usa faixa branca porque não tem experiência. Cor branca significa "novo e limpo". Enquanto você treina, o cinto escurece, mostrando progresso. A cor representa a sujeira acumulada com muito trabalho e suor. Um artista marcial com muitos anos de experiência chega ao cinturão negro, o que significa um alto nível de conhecimento e habilidades.

Tradicionalmente, os cintos eram apenas pretos ou brancos. Nas últimas décadas, mais flores apareceram. Hoje, diferentes escolas de artes marciais usam cores diferentes. O esquema depende do estilo, escola e país.

Por que estamos falando de artes marciais?


As cores dos cintos são usadas para traçar um paralelo entre as habilidades de software e as artes marciais. Para fazer isso, use o esquema de cores comumente usado na Europa: branco, amarelo, laranja, verde, azul, marrom e preto.

A tabela a seguir mostra os níveis de desenvolvedor dos quais falei. Para cada um, são mostradas a cor do cinto e a posição, que geralmente é dada a um especialista nesse nível:

Nível profissionalNível das artes marciais (cor da correia)Postar exemplo
NovatoBranco
HackerStreet Fighter (sem cinto)
CodificadorAmareloDesenvolvedor Júnior (Jr.Dev)
ProgramadorLaranjaDesenvolvedor de software
Pesquisador (cientista da computação)VerdeDesenvolvedor de Software
Desenvolvedor de softwareAzulDesenvolvedor de software sênior (Sr. Software Dev)
Engenheiro de SoftwareCastanhoDesenvolvedor Líder (Principal Dev)
Arquiteto de SoftwarePretoArquiteto de Software

O nível de habilidades de engenharia está relacionado às habilidades técnicas e de trabalho em equipe. O título da postagem é um exemplo de como uma pessoa nesse nível é chamada no setor (isso depende muito da empresa e da região).

Iniciante: Faixa Branca




Você tem que começar de algum lugar, e geralmente esse é o nível de "nenhuma experiência". Um iniciante no desenvolvimento de software é alguém que acaba de se familiarizar com a programação e está nos estágios iniciais do treinamento. Os iniciantes ainda não conseguem programar com confiança e não entendem programas simples, sem consultar livros, livros didáticos ou pedir conselhos a um amigo experiente.

Iniciantes são capazes de escrever código de trabalho, mas geralmente não entendem os detalhes de por que esse código funciona. Eles passam muito tempo pesquisando fragmentos de código no StackOverflow ou sites semelhantes e combinando esses fragmentos até que algo funcione.

Ferramentas poderosas não são apenas habilidades confiáveis.


Para tornar as coisas ainda mais confusas, muitas linguagens e estruturas “modernas” permitem que qualquer pessoa gere estrutura e algumas implementações de programas complexos sem entender o que está acontecendo nos bastidores. Por exemplo, o lançamento de um aplicativo Ruby on Rails simples e a aceitação de solicitações HTTP podem ser organizados usando vários comandos da linha de comando.

Veja como fazer isso em * nix:

$ gem install rails

$ rails new website

$ cd website
$ bin/rails server
...


Feito! Isso é suficiente para o servidor responder às solicitações HTTP do navegador. Se você comparar com artes marciais, é assim que aparece no tatami de armadura e armas. A armadura permitirá que você viva um pouco mais e, com uma arma, poderá vencer a batalha. Mas essa vitória não faz de você um artista marcial qualificado. Essas ferramentas simplesmente permitem que você faça algo complexo sem treinamento e esforço tradicionais.

Não me interpretem mal. Ferramentas como Ruby on Rails permitem que você faça as coisas rapidamente, e são ótimas. Na verdade, acho fantástico reduzir o tempo necessário para escrever o código padrão inicial. Este é um ótimo começo para o projeto, mas apenas uma faixa branca é suficiente.

A verdadeira batalha começa onde o tutorial termina, onde as ferramentas não podem gerar automaticamente o aplicativo que você precisa. Para seguir em frente, você precisa se tornar um codificador.

Exemplo


Se um iniciante deseja escrever um programa que resume um conjunto de números usando Ruby, ele pode pesquisar a pergunta no Google e encontrar essa página . Este é o primeiro resultado do Google no momento desta redação. Na página StackOverflow, a resposta mais prolífica com 524 votos:

 array.inject(0){|sum,x| sum + x } 

Claro que funciona. Aqui está um exemplo:

 $ irb 2.4.2 :001 > array=[1,2,3] => [1, 2, 3] 2.4.2 :002 > array.inject (0){|sum, x| sum + x } => 6 

Isso pode funcionar para um iniciante, mas ele não entende os recursos deste código. Quão legível é? Qual é a velocidade em comparação com outras opções? É fácil de manter? Por que isso funciona? O que exatamente acontece quando essa linha é executada? Quanto tempo de CPU é usado? As variáveis soma e x são definidas após a execução desta linha?

O desenvolvedor iniciante em Ruby não sabe as respostas para a maioria dessas perguntas.

Codificador: Cinto Amarelo




Um codificador pode, sem ajuda externa, coletar muitas linhas de código de computador para resolver problemas simples. O resultado não será muito bonito, mas o codificador entende por que o programa funciona e ele conclui com êxito a tarefa.

Primeiro passo necessário


Liguei para o meu blog CoderHood, porque todo mundo que ganha a vida programando em algum momento atingiu o nível do codificador. A palavra Coderhood reflete a vida de um desenvolvedor no mundo da tecnologia, começando com o primeiro cinturão amarelo.

A principal diferença entre um iniciante e um codificador é que o codificador é capaz de escrever e entendê-lo. Eles podem não entender em detalhes o que está acontecendo nos bastidores, mas ele sabe por que escreveu esse código.

Na indústria, geralmente é atribuído a um codificador uma posição como "desenvolvedor júnior" (jr. Developer) ou estagiário (desenvolvedor em treinamento).

Exemplo


Eu acho que o "codificador Ruby" poderá criar a maioria dos métodos a seguir para calcular a soma de uma matriz de números inteiros e entender a diferença entre eles:

 $ irb 2.4.2 :001 > array=[1,2,3] => [1,2,3] 2.4.2 :002 > array.inject (0){|sum, x| sum + x } => 6 2.4.2 :003 > sum=0;array.each { |x| sum+= x } => 6 2.4.2 :004 > array. sum => 6 2.4.2 :005 > array.inject(0, :+) => 6 2.4.2 :006 > array.reduce(0, :+) => 6 2.4.2 :007 > eval array.join '+' => 6 

Se você estiver interessado, alguns desses métodos são terríveis, mas funcionam.

Hacker: jeans sem cinto




Coloquei um "hacker" na lista porque me perguntaram sobre isso. Mas não é adequado para a nossa discussão.

Não é a habilidade principal


Eu não acho que "hacking" seja uma habilidade necessária no desenvolvimento de um desenvolvedor de software. Essa experiência é útil para aprender como testar e proteger aplicativos e sistemas de software, mas não vejo aqui uma descrição do "nível de habilidades" geral. Eu classificaria isso como uma determinada área de atividade, e não como um nível de habilidade técnica. De fato, o nível de habilidade de um hacker pode ser qualquer. Alguns deles são incríveis, enquanto outros não .

Como o hacking não é uma etapa necessária no desenvolvimento de um desenvolvedor, pela minha analogia, um hacker não tem um cinto tradicional. Eles se parecem mais com lutadores de rua vestindo jeans.

Alguns deles são bandidos do mal, outros estão tentando sobreviver, outros são mocinhos que protegem o resto, mas a maioria está em algum lugar no meio.

Muitos tipos de "hackers"


Existem muitos tipos de hackers. Alguns podem programar, outros não. O significado da palavra depende do contexto e de quem a usa. Algumas definições comuns:

  1. Um especialista em informática que adere a uma subcultura de tecnologia e programação.
  2. Uma pessoa que pode comprometer a segurança do computador para fins maliciosos (chapéu preto) ou de pesquisa (chapéu branco).
  3. Um desenvolvedor que faz o trabalho da maneira mais rápida e suja.
  4. Pessoa que estuda, experimenta ou investiga sistemas, equipamentos e sistemas de telecomunicações conectados a redes telefônicas. Esses hackers também são chamados de phreakers.
  5. Um engenheiro qualificado que trabalha muito próximo ao hardware para obter um melhor controle do sistema em prol de um bom trabalho (ou seja, para extrair mais desempenho do equipamento) ou para fins maliciosos (ou seja, para usar brechas de segurança e encontrar uma maneira de contornar a proteção da sala de operações) sistemas).

Alguns exemplos


Tipo 3


Um hacker do tipo 3 pode escolher esta opção para somar uma matriz de números inteiros:

$ irb
2.4.2: 001> 'eco "1 2 3" / bc'.to_i
=> 6

O método funciona, pelo menos em alguns sistemas, mas é ... um "hack completo". O mesmo acontece com hackers não qualificados que podem programar. Eles resolvem problemas de maneira duvidosa, geralmente executando comandos ilegíveis da linha de comando até obterem o resultado desejado.

Tipo 5


Os hackers do tipo 5 trabalham em um nível muito baixo. Essas habilidades não são fáceis de adquirir e podem ser muito valiosas se você estiver tentando configurar a proteção de software ou criar aplicativos de desempenho extremamente alto. Eu nunca fui um "hacker", mas programei em um nível baixo (C e assembler) e, no fundo, ainda me considero um especialista em programação de baixo nível.

Os hackers do tipo 5 podem ser fantásticos lutadores de rua, com habilidades malucas que limparão o nariz de muitos programadores profissionais em algumas tarefas especializadas. Esses "hackers" poderiam somar uma matriz de números inteiros usando assembler como este .

Programador: orange belt




Um programador pode escrever aplicativos funcionais, entender os algoritmos básicos e conhecer o básico da ciência da computação. Ele pode fazer o programa funcionar, mesmo que não seja muito escalável e tenha suporte a longo prazo. Como regra, um programador trabalha bem sozinho. Não é o fato de ele ser um bom jogador de equipe.

A maioria dos desenvolvedores para nesse nível, principalmente se não planeja estudar a teoria da ciência da computação. Os programadores podem escrever código decente e trabalhar na indústria de software nesse nível ao longo de suas carreiras.

Do ponto de vista do trabalho, os programadores costumam ser chamados de "desenvolvedores de software" ou "engenheiros de software".

Em um exemplo simples da soma de uma matriz de números inteiros, um programador pode escrever código desta maneira:

 #!/usr/bin/env ruby if ARGV.size==0 puts "Usage: " puts " sum [  ,  ]" else puts ARGV.sum{|x| x.to_i} end 

Esse código implementa um comando de linha de comando útil para resumir uma lista de números. Se você chamá-lo sem parâmetros, ele exibirá uma mensagem de uso útil. Caso contrário, imprime a saída padrão. Aqui está um exemplo de uso:

$./sum
Usage:
sum [ , ]
$ sum 1 2 3
6


Esta é uma "solução completa", auto-documentada e um tanto abstrata, porque o programa pode ser chamado a partir da linha de comando.

Pesquisador: Green Belt




O pesquisador (cientista da computação) estudou ciência da computação na escola ou no trabalho. Ele tem um bom entendimento de tais conceitos:

  • Base Base-N (N = 2, 10, 16)
  • Operações binárias
  • Lógica booleana
  • Complexidade algorítmica e notação big-O
  • Estruturas de dados (matrizes, listas vinculadas, árvores B, árvores vermelho-preto, filas, pilhas, tabelas de hash, pilhas, conjuntos, gráficos)
  • Algoritmos de classificação e quando usá-los
    • Compreensão básica da completude da PN
  • Algoritmos multithread básicos
  • Gerenciamento de memória e coleta de lixo (apenas porque sua linguagem de programação cuida do próprio gerenciamento de memória não significa que você pode pular este tópico)
  • Ponteiros (você precisa entender pelo menos o conceito, mesmo que não codifique em C) e a diferença entre passar parâmetros por valor ou referência.
  • Conceitos de POO (interfaces, herança, construtores, destruidores, classes, objetos, abstrações, encapsulamento, polimorfismo, etc ...)
  • Design e modelos orientados a objetos
  • Recursão
  • Alguns conceitos básicos sobre programação dinâmica, análise gananciosa e de amortização, comparação de strings e algoritmos de aproximação

O pesquisador é formado em Ciência da Computação ou, por muitos anos, trabalhou como desenvolvedor, estudando ciência da computação aplicada no trabalho. Como você sabe, não acho que seja necessário um diploma de CS para uma carreira de desenvolvimento bem-sucedida .

O mero status de "cientista da computação" não faz de você um excelente programador. Aqui a analogia com as cores dos cintos parece ser violada. Mas isso não é verdade. Pense deste lado: mesmo no mundo das artes marciais, existem especializações. Alguns cinturões verdes fazem algumas coisas melhor que outros. A progressão é não linear. A cor do cinto geralmente representa o nível de experiência e a quantidade de trabalho despendida no domínio da arte marcial, em vez do nível de habilidade necessário em todos os aspectos.

O cientista provavelmente escreverá o mesmo código para a soma dos números que o programador. A diferença é que o cientista pode dizer imediatamente que a complexidade desse algoritmo é O (n) tempo. Como já mencionado, este é um exemplo elementar, mas você captou o pensamento.

Desenvolvedor de software: Blue Belt




Um desenvolvedor de software pode lidar com projetos maiores e mais complexos. Comparado a um programador e pesquisador, ele:

  • Grava código mais limpo, mais estruturado, mantido, documentado e legível.
  • Permite menos erros.
  • Funciona mais rápido.
  • Ele trabalha melhor em equipe e entende o valor dos processos de desenvolvimento.
  • Localiza e otimiza melhor os gargalos nos sistemas de código e software.
  • Tem mais experiência.

Exemplo


Em um exemplo simples de uma soma de números inteiros, um desenvolvedor de software pode resolver o problema criando um serviço que fornece uma API da Web. A interface pega um conjunto de números inteiros e retorna a soma.

Acredito que o aplicativo seja bem documentado e suporte as configurações, seja acompanhado por testes, tenha a estrutura de código correta e seja facilmente mantido por outros desenvolvedores.

No Ruby, o aplicativo principal usando o Sinatra pode ser algo assim:

 require 'sinatra' require "sinatra/config_file" # Load the server configuration from config.yml: config_file 'config.yml' # # EndPoints: # # /sum/n1 n2 n3 n4 ... # Return: # {result: [sum of n1,n2,n3,n4,...]} # # Example: # $ curl http://localhost:8080/sum/1 2 3 4 # {"result":"10"} # get '/sum/:numbers' do |numbers| {result: numbers.split(" ").collect{ |x| x.to_i}.sum}.to_json end 

Um bom desenvolvedor de software está ciente das muitas limitações desta solução em comparação com outras. Por exemplo, é limitado à soma de um conjunto de números que cabe em um URI; não há verificação de erro explícita; as linhas devem começar com um número etc.

Engenheiro de software: Brown Belt




A diferença entre um desenvolvedor de software e um engenheiro de software é sutil; Eu admito isso completamente. Esses termos são comumente usados ​​como sinônimos. No entanto, suponho que o engenheiro de software seja um especialista com conhecimento no campo da ciência da computação e vasta experiência como desenvolvedor de software. As principais diferenças:

  • Capacidade de criar sistemas mais escaláveis.
  • Longevidade. Eles trabalham mais e com menos problemas.
  • Menos erros e melhor qualidade do código.
  • Capacidade de atuar como gerente e equipe técnica de projetos.
  • Excelentes habilidades de colaboração e comunicação.
  • Conhecimento suficiente da arquitetura de software para fazer o trabalho.

Nas empresas, esses desenvolvedores podem ter os cargos de "desenvolvedor sênior" ou "desenvolvedor sênior".

Exemplo


Um engenheiro de software pode escrever um aplicativo como desenvolvedor criando um serviço e fornecendo uma API para obter um conjunto de números inteiros. Mas acredito que a decisão do engenheiro incluirá algumas melhorias:

  • Resultados de armazenamento em cache.
  • Abstração do conceito da soma para qualquer expressão matemática na consulta.
  • Registro, autenticação, rastreamento de gancho, etc.

Exemplo se torna estúpido


Como você pode ver, um exemplo simples demais nesse estágio se torna um pouco bobo. Tudo se resume a uma discussão sobre como melhorar uma solução já redundante para um problema trivial.

Por exemplo, gerenciar um cache com os resultados de operações simples em um pequeno conjunto de números é provavelmente mais difícil e mais lento que os cálculos simples. Um cache faria sentido no caso de uma enorme variedade de números a serem passados ​​para a API, mas a lista não caberia no URI da solicitação.

Você pode mover a lista de números para o corpo da solicitação, mas ela não será mais a API RESTFUL e a solicitação não será mais armazenada em cache. Nesse momento, será tentador alterar a solicitação para POST, mas nunca ficará em cache. De qualquer forma, a discussão pode continuar.

Parte crítica


Veja o que está acontecendo? À medida que as habilidades do desenvolvedor melhoram e os projetos se tornam mais complexos, algo engraçado acontece. Os problemas estão cada vez mais se afastando do "código principal". Em vez disso, eles estão cada vez mais processando o contexto em que o código principal funciona.

Como resultado, desenvolvedores altamente qualificados passam a maior parte do tempo aprimorando os aspectos do sistema, como escalabilidade, desempenho, verificação de erros, confiabilidade, manutenção, abstração, portabilidade, processamento de condições de contorno etc.

Além disso, eles aprenderão como trabalhar com mais eficiência ou melhorar a interação com outros desenvolvedores e como trabalhar para minimizar riscos, etc. O desenvolvimento de software muda da codificação para os sistemas de engenharia e a solução de problemas.

Arquiteto de software: Black Belt




Todos os desenvolvedores e engenheiros devem poder projetar as partes dos sistemas e produtos que pretendem construir. O “arquiteto de software” eleva essa habilidade a um nível mais alto e faz uma escolha ao projetar interações de alto nível de sistemas de software maiores desenvolvidos por outros engenheiros.

Exemplo


Em nosso exemplo, entre outras coisas, um arquiteto pode desenhar um diagrama para direcionar o desenvolvimento de um serviço para somar números inteiros:



Para resolver efetivamente esses problemas, um arquiteto de software precisa de anos de experiência em todos os níveis. Essa experiência prática entra na memória muscular. Ele permite que o arquiteto tome as decisões corretas de alto nível sem focar nos detalhes.

No entanto, não acredito em arquitetos puros, ou seja, engenheiros que tomam decisões em tempo integral em alto nível. Penso que um arquiteto confiável deve descer ao nível de detalhes individuais e sair dali quando necessário. Ele está pronto para mergulhar regularmente e efetivamente no código.

Nas artes marciais, o faixa-preta é professor e mentor. Eu acho que o treinamento e a orientação também são tarefas de um arquiteto de software. O ensino de que estou falando não é direto (palestras), mas é feito mais pelo exemplo, mostrando o caminho e orientando as pessoas a tomar suas decisões.

Conclusões


Lutadores sérios estudam arte marcial a vida toda; desenvolvedores de software sérios fazem o mesmo. Espero que você tenha achado essa discussão útil. Espero que ele forneça um contexto para alguns termos mal definidos e, idealmente, ajude a explicar como usá-los com mais precisão.

Source: https://habr.com/ru/post/pt418467/


All Articles