Programar não se trata de mastigar o teclado e digitar o mais rápido possível. Não se trata de memorizar religiosamente os atalhos do teclado e, em última instância, tornar o mouse obsoleto. Não se trata de aprender todas as linguagens de programação por aí, se é que isso é mesmo possível em primeiro lugar. Um bom programador não é definido pela marca, preço, desempenho e sistema operacional de seu computador, nem por sua preferência de editores de código e IDEs-VS Code, Atom, IntelliJ IDEA, Vim, Notepad++, ou outro. Ao contrário da crença popular graças a muitos filmes de Hollywood, a programação definitivamente não é equivalente ao hacking.
Outras coisas, ela vai além de memorizar a sintaxe e as funcionalidades embutidas de uma linguagem de programação. Lógica, condições, if
declarações, e algoritmos – particularmente os de classificação – não pintam um quadro completo do que é realmente a programação. Matemática, recursividade, informática e padrões de design também não fazem justiça a ela. Embora sejam uma grande parte do que é programação, eles são apenas uma peça do quebra-cabeças.
Projetando e planejando
Antes de escrever uma única linha de código, o design e a arquitetura de um projeto são cuidadosamente planejados para garantir ou pelo menos aumentar a probabilidade de ter um ciclo de desenvolvimento suave. É aqui que o design de software entra em jogo. Cadeias de ferramentas, pipelines, camadas de abstrações para APIs públicas e internas, modularização, relações de objetos e estruturação de banco de dados são todos planejados durante este estágio de desenvolvimento.
Estamos vivendo, respirando depuradores
A arte da programação exige que pensemos fora da caixa e resolvamos problemas com as soluções mais pragmáticas, efetivas e viáveis. Esta é provavelmente a razão pela qual somos muito provavelmente o “tipo de T.I.” ou “suporte ao cliente” do lar. É praticamente o nosso trabalho consertar o que está quebrado. É como se “programar” fosse uma forma glorificada de dizer “resolver problemas”.
Em outras palavras, estamos vivendo, respirando depuradores dentro e fora de nossos computadores, e por causa disso, é importante que saibamos como ler e escrever documentação. Documentação adequada – que vem na forma de páginas reais de documentação detalhada, ou tão simples como aspergir comentários que valem a pena para a base de código – como uma das linhas de vida mais importantes de um programador. Sem ela, estamos perdidos no escuro, incapazes de cumprir os nossos próprios deveres como depuradores. Pouco ou nenhum progresso pode ser feito porque a maior parte do nosso tempo seria gasto em experiências e investigações de como funciona uma estrutura ou base de códigos legados. Em geral, isso resultaria em uma experiência terrivelmente horrível para desenvolvedores.
Considere todos os cenários possíveis
Debugging já é difícil o suficiente. Para piorar a situação, a execução do código normalmente não é linear. Grandes projetos envolvem múltiplos “ramos” de possíveis caminhos de execução devido à lógica do programa com a instrução if
. Temos que levar em conta cada cenário e erro possível, especialmente se envolve a entrada do usuário. A carga cognitiva necessária para acompanhar todos os caminhos de execução possíveis torna a programação ainda mais difícil.
Experiência do usuário
Passar fora do mundo do desenvolvimento, nós preenchemos os sapatos de um usuário médio. Além de fornecer funcionalidades, adicionar novas funcionalidades, corrigir bugs e documentar nossa base de código, nós também nos concentramos em como um usuário comum interage com nosso aplicativo ou software. Nós consideramos múltiplos fatores que levam a uma grande experiência do usuário, tais como (mas não limitados a) acessibilidade, usabilidade, facilidade de uso e -discobribilidade, design de interface, temas de cores, animações funcionais e performance.
Performance e Otimização
Fala do qual, performance é uma enorme faceta da programação em si. Nós, especialmente aqueles com formação em ciência da computação, nos esforçamos para usar e escrever os algoritmos mais eficientes no tempo e espaço. Estamos obcecados com a escala de tempo insondável dos microssegundos de modo a extrair o máximo da nossa memória disponível, CPUs e GPUs.
No contexto do desenvolvimento web, a optimização de redes é um conceito importante a apreender. Nós saltamos através de hoops para minificar e comprimir nosso HTML, CSS e JavaScript apenas para minimizar a carga útil de uma resposta do servidor. Imagens e outros recursos diversos também são compactados e carregados com preguiça para minimizar a quantidade de dados que o usuário tem que baixar antes que uma página se torne significativa e utilizável.
No entanto, há momentos em que ficamos muito obcecados com o desempenho. A otimização prematura torna-se um problema quando nos preocupamos desnecessariamente em otimizar certas partes de uma base de código em vez de nos concentrarmos no que precisa ser feito para o progresso e produtividade reais. Nesse caso, devemos ter a sabedoria de julgar quais partes da base de código realmente precisam de otimização.
Segurança
Além da IU e da lógica do nosso software, como programadores, somos responsáveis pela segurança dos nossos usuários. Nos nossos dias, onde os dados são muito cobiçados e fortemente monetarizados, é mais importante do que nunca garantir que as informações pessoais dos nossos usuários estejam seguras. Tomamos medidas extra para proteger os dados privados porque os nossos utilizadores confiam no nosso software. Se não cumprirmos essa responsabilidade, certamente não somos verdadeiros programadores, nem mesmo por um longshot.
Nunca podemos estar demasiado seguros quando nos aproximamos da segurança. Como regra geral, nós “nunca confiamos na entrada do usuário”. Pode até ser considerado uma “melhor prática” fazer um grande esforço para higienizar os dados e a entrada do usuário. Não só colocamos o nosso software e infra estrutura em grande risco se não tivermos cuidado com eles, como também corremos o risco de comprometer os dados sensíveis do usuário – os próprios dados que prometemos proteger como programadores.
Securança não é exclusiva para os dados do usuário e entrada de dados, no entanto. Vírus, worms, cavalos de Tróia, adware, key loggers, ransomware, e outras formas de malware de computador continuam a se espalhar e afligem milhões e milhões de computadores e dispositivos ao redor do mundo. Mesmo depois de décadas de melhorias tecnológicas em hardware e software, não existe tal coisa como um sistema invulnerável. A segurança é simplesmente uma arte que está sendo aperfeiçoada continuamente, mas nunca será aperfeiçoada, pois sempre haverá os poucos inquisitivos que investigam e procuram por todas as formas possíveis de “hackear” um sistema.
Por essa razão, independentemente do caso de uso e da base de usuários, projetamos nosso software com a segurança em mente como uma das principais prioridades, se não a prioridade máxima. Fazemos isso para proteger nossos usuários das ameaças acima mencionadas que podem causar inconvenientes como perda de dados, corrupção de arquivos e falhas de sistema, para citar alguns.
Trabalho em equipe faz o sonho funcionar
Even se não estiver necessariamente relacionado à programação, o trabalho em equipe tem um papel extremamente integral no desenvolvimento de software. Com toda a complexidade e partes móveis de qualquer grande projecto, é impossível para uma só pessoa desenvolver software de qualidade ao ritmo acelerado da iteração regular ou sob os rigorosos prazos e restrições de tempo de um cliente ou qualquer entidade supervisora.
É por isso que temos várias equipas de pessoas especializadas numa das muitas facetas da programação. Uma pessoa nunca terá todas as habilidades e conhecimentos necessários para colar de forma eficaz e coesa todas as facetas. Uma equipa pode ser responsável pelo design e acessibilidade da interface do utilizador enquanto outra pode trabalhar na funcionalidade do software em si. Se todas as competências das várias equipas especializadas forem combinadas, o software resultante terá a melhor funcionalidade, experiência do utilizador, desempenho e segurança que pode eventualmente ter dentro das restrições financeiras e práticas.
Para a gestão do tempo e cumprimento de prazos, a organização e automação do fluxo de trabalho são da maior importância. Levamos o tempo necessário para configurar corretamente nossas ferramentas de construção e pipelines, pois isso nos poupará muito tempo no futuro. Em geral, o retorno do investimento aumenta conforme o tempo passa.
Trabalhando bem com os outros
Para expor a idéia de trabalho em equipe e cooperação, estabelecemos relações saudáveis com nossos pares porque, no final, o sucesso de um projeto depende muito do sucesso da equipe por trás dele. Fazemos um esforço para promover um ambiente de trabalho de apoio, onde os idosos experientes guiam os recém-chegados.
Desde que desenvolvemos software como uma equipe, temos de estar atentos aos outros lendo o nosso código. Para manter o ciclo de desenvolvimento sustentável a longo prazo, a legibilidade e a manutenção são consideradas tão importantes quanto a lógica e a funcionalidade de um projeto. Nós consistentemente escrevemos código bom e legível enquanto fornecemos mensagens informativas e documentação de compromisso, porque estas definitivamente nos ajudarão e aos outros a entender nosso código mais.
Por falar de outros lendo nosso código, uma revisão de código é uma grande oportunidade para aprender mais sobre as melhores práticas em programação. É também uma outra forma de nos familiarizarmos com uma base de código e seu design e arquitetura subjacentes. Embora a crítica construtiva seja desagradável e difícil de lidar na extremidade receptora, é importante tomá-la como um bom conselho para que possamos melhorar como programadores.
Programação é difícil
Programação abrange muitos aspectos além da funcionalidade, como experiência do usuário, performance, segurança e trabalho em equipe. Não é suficiente focar estritamente em um aspecto sozinho, omitindo os outros. Para projetos de tamanho e importância notáveis, não é tão simples quanto digitar algumas linhas de código. Requer muito planejamento cuidadoso, design, consideração e cooperação em equipe para ser bem sucedido. Na verdade, mais tempo é gasto pensando do que digitando quando se programa, especialmente durante longas sessões de depuração.
No final, programar é realmente uma aprendizagem contínua, sem parar. Adaptabilidade e aprendizagem constante são as chaves para sobreviver a esta indústria. Não podemos esperar permanecer relevantes se não fizermos a nossa parte para continuar aprendendo. Em uma indústria tão volátil e de melhoria tecnológica exponencial, temos que acompanhar o seu ritmo rápido para não acabarmos na poeira.
Quero concluir este artigo reconhecendo o trabalho árduo de todos os desenvolvedores ao redor do mundo. Para escrever este artigo, tive que refletir sobre o fluxo de trabalho diário de uma equipe de desenvolvedores. Eu tive que olhar para os muitos aspectos da programação e desenvolvimento de software que normalmente passam despercebidos. Desde então, tenho tido uma maior apreciação por todo o software instalado no meu computador. Para isso, encorajo a todos a agradecer a um programador de hoje, independentemente da experiência. Onde estaríamos sem eles?
Nunca tomem como certo o seu trabalho árduo.