Ser um desenvolvedor full-stack moderno


Eu moro na periferia de uma reunião tecnológica. E na periferia em um sentido geográfico. E isso significa que:


  • Eu nunca estive em conferências profissionais. Só porque nunca foi dada essa oportunidade.
  • Nunca comprei cursos de formação: é estranho para mim pagar pelo que você pode aprender sozinho na Internet ou em livros. É tentador, é claro, obter conhecimento concentrado, apoiado em tarefas práticas, obter um certificado. Mas, por isso, nunca tive dinheiro nem tempo.
  • Sou adepto do ascetismo digital: não por vontade própria, mas como produto da eterna reestruturação em nosso país. Em curtos períodos de estabilidade financeira, atualizo a eletrônica de forma residual. Então agora eu estou escrevendo este texto no Core2Duo há dez anos. Ainda estou esperando o próximo platô estável na minha curva de ganhos.
  • Três vezes na minha vida eu comprei jogos. Nos anos 90. Estes eram cassetes para o obsoleto Spectrum. Olho para a compra de software com surpresa: quando todos usavam software pirateado, eu também o utilizava sem entender a essência do problema. E então, no início dos anos 2000, mudei completamente para o Linux e não havia nada para comprar.
  • Surpreendentemente, eu nunca perdi um telefone celular, desde o início do surgimento da comunicação GSM. E eles nunca quebraram ou não foram reparados. As três peças estão na prateleira, e a quarta, um smartphone, está no seu bolso. Ele tem cinco anos Não tenho experiência em comprar software no Google Play, nem sei como fazê-lo. A esposa sabe, mas eu não.
  • Peço aos provedores que me incluam na lista negra e não me liguem com ofertas para "comprar a Internet" ou um pacote de televisão. Como não tenho TV, e para a Internet tenho velocidade mínima suficiente. Peço que não me fale sobre as novas tarifas para comunicações móveis, porque escolho a mais barata disponível.
  • Eu nunca vi estrangeiros falantes de inglês ao vivo. E ele nunca falou com estrangeiros em uma voz. Essa oportunidade nunca foi dada no meu canto de urso, embora fosse interessante. Estou lentamente bombeando meu inglês, mas preciso dele apenas para ler literatura.

Provavelmente o suficiente. Quem sou eu e o que estou fazendo no Habrahabr? O fato é que eu ... eu sou um sobrevivente permanente. Em outras palavras, um desenvolvedor moderno de pilha cheia. Oh, eu posso imaginar como os programadores de perfis agora desaprovaram! Fullstack ... O que posso dizer a eles? Gente, eu ficaria feliz em desenvolver habilidades em uma direção. Eu ficaria feliz, como você, por mergulhar no tópico e se tornar um guru altamente especializado. Mas, infelizmente, a realidade é que, nas regiões em que uma pessoa em um local remoto precisa se agarrar a qualquer trabalho, apenas para não se identificar ou se tornar um motorista de táxi.


Com quais idiomas eu tenho que lidar e distribuir as coisas prontas? Se você fizer uma seleção em uma linha do tempo, obterá a seguinte lista:


Linguagem e TecnologiaTema do Projeto
C & Assembler x86Para a alma
FoxPro 2.6, NetwareImpostos e contabilidade
PHP4 & LAMPDesenvolvimento Web
AnSYS e StarCD e MathCADAnálise de força, cálculo de fluxos de fluidos e gases
1C v7Contabilidade e contabilidade de armazém
C ++ 98Embarding e jogos
PHP5, LNMP e CodeigniterDesenvolvimento Web
C ++ 03/11 & QtSoftware de código aberto
1C v8 e PostgreSQL e LinuxProcessos de negócios em usinas nucleares
Python 2.7Alertas por SMS
PHP7 e LNMP e Yii2Desenvolvimento Web
C ++ 11 e Qt, QML e JavaCartografia e navegação, desenvolvimento móvel para Android
PHP7 e LNMP e Laravel e SIPDesenvolvimento Web e Telefonia

Sim, eu mesmo tenho medo dessa mistura. Que tipo de arremesso encantador? Está certo? Análise de força da Web - contabilidade de estoques - jogos ... Usinas nucleares, cartografia, telefonia. Autor, você está falando sério? Absolutamente! A vida vai apertar - você não está se levantando muito.


Margem da transição


Para sentir a beira da transição de um projeto para outro, considere as duas linhas inferiores da tabela acima. Para o projeto, a partir da penúltima linha “Cartografia e navegação, desenvolvimento móvel para Android”, faremos apenas com os links.



E para completar a imagem, mais algumas publicações:



E sobre a linha de fundo da tabela "Desenvolvimento Web e telefonia" , discutirei mais adiante neste texto.




Portanto, um projeto promissor de um aplicativo móvel para Android para equipamentos de navegação personalizados está se fechando bastante. Ontem, o desenvolvedor escreveu o código de back-end em C ++ e a frente em QML, fixou o código nativo em Java via JNI e hoje ele deve procurar freneticamente a vaga do desenvolvedor de C ++ no site remoto. O mercado C ++ moderno é tal que encontrar um empregador na Rússia com C ++ em um site remoto é um grande sucesso. Todos os empregadores querem ver um programador C ++ no escritório. O mês na pesquisa é um zero completo. É hora de treinar novamente, o benefício do plano de fundo permite.


Definição de


O desenvolvedor Fullstack (representante de uma família de especialistas ao redor) é um personagem mítico, o objeto de desejo de um empregador que deseja otimizar a produção de software para uma equipe de uma pessoa. O desenvolvedor do Fullstack possui habilidades mágicas: ele tem uma memória sem fundo, porque conhece todas as linguagens e tecnologias modernas; o aparato conceitual global é integrado ao cérebro, superior na organização do processo de pensamento de Vladimir Lenin, Albert Einstein e Leonardo da Vinci; o pensamento sistêmico de tal especialista é capaz de depurar qualquer coisa diretamente no cérebro, sem o uso de ferramentas de depuração. Despretensioso, alimentado pela luz solar.

Transição para uma nova tarefa


De repente, o usuário haar de itsar vem até mim e leva para sua equipe. Ele tem várias tarefas pendentes e estou implementando um protótipo de serviço da web para teste. Conforme planejado, o serviço da web notifica os usuários de vários eventos por meio de vários canais de comunicação, incluindo chamadas telefônicas. Como resultado, apareceu o site QrCall.org , sobre o qual já estava escrito em Habrahabr: Vá lá - não sei onde .


No futuro, escreverei imediatamente os prazos: a discussão e a redação da tarefa técnica levaram duas semanas, levou um mês e meio para criar a primeira implementação e colocá-la em produção.


Para entender, até o momento, este serviço da Web se parece com este (versão do desenvolvedor):



Portanto, precisamos pular de C ++ para PHP7 e a pilha de ferramentas correspondente às realidades modernas. Não há tempo para o acúmulo (C) Putin. Straustrup, Schildt, Gottschling, Salter e Klepper são colocados na prateleira mais distante. Paralelamente à escrita de TK, lembro que eles o inventaram no PHP7. A consulta "o que há de novo no PHP7" fornece vários artigos sobre o Habrahabr e sobre blogs de programação. Sim, namespaces e importações, um novo tipo de operador ternário e qualquer açúcar sintático, tipos escalares e outros como eles, classes anônimas, fechamento final, geradores ... Na maioria das vezes, tudo é familiar. Mais uma vez, observo por mim mesmo que o PHP é um prazer divino, comparado às vantagens sérias.


Seleção de ferramenta


Telefonia


Mais preocupado com a futura implementação da telefonia. Eu vou dominar? Está imediatamente claro que você precisa trabalhar com o SIP, mas como? Há uma memória no meu cérebro que eu costumava jogar com algum cliente SIP do console, e até poderia discar um número de telefone e fazer uma ligação. Para resolver o problema, isso será suficiente. Em um caso extremo, você deve se confundir com o Asterisk. Estou ligando para um sinalizador familiar, descrevendo a essência do problema, pedindo que você me lembre que tipo de cliente de console eu poderia sentir. O veredicto é inequívoco - este é o Linphone e seu console linphonec . Mas discar um número no console não é suficiente. Você ainda precisa reproduzir o arquivo de som no telefone virtual. Instale o Linphone, vá para o console e veja as possibilidades. Portanto, é possível alternar de um dispositivo de som para um arquivo. Isso é bom E no console existe um comando play que inicia um arquivo de áudio para reproduzir. Em princípio, nada mais é necessário.


Embora não, ainda há o problema de chamadas simultâneas. Discuto isso com itsar , ele diz que os alertas de chamadas são raros, basta alinhá -los. Limite apenas a duração. Oh bem. Nesse caso, não há mais perguntas sobre telefonia.


Framework PHP e gerenciador de pacotes


Em seguida, você precisa decidir em qual estrutura executar o projeto e, ao mesmo tempo, lidar com o gerenciador de pacotes do Composer. Anteriormente, eu apenas olhei para o Composer e instalei o Yii2 sem componentes, porque no Yii2 tudo o que era necessário já estava incluído. Bem, independentemente da estrutura que eu escolher, o Composer ainda será necessário. Eu li como instalá-lo. Aposto que funciona.


A seguir, está a pergunta sobre a estrutura. Descobri que em 2019, o Yii2 não é mais relevante e o Yii3 está preso em algum tipo de estado intermediário. O que resta? Para Zend e Symfony, ainda não amadureci, então praticamente não há opções - apenas o Laravel . Li a documentação, examine os manuais, encomendei um livro de um autor de língua russa (acabou sendo muito sensato, o que é necessário para começar). Após o antigo Codeigniter e o irrelevante Yii, a estrutura do Laravel é facilmente entendida, você pode ver imediatamente como a idéia de programação progrediu no design de aplicativos da web. Tudo o que se sonhava já foi implementado, executado e cheio de abordagens padrão. Sim, o projeto não está carregado, para que eu possa pagar alguma curvatura núbia na implementação.


Coloquei o Laravel "por padrão", sugerindo ao Composer que decida por si mesmo qual versão do Laravel é atualmente relevante. Ele coloca 5.5. Bem, seja esta versão, é mais rápida que a 5.8, por isso será mais fácil resolver problemas. Não buscamos inovação.


NPM


Alguns componentes do Laravel, por exemplo, o sistema de compilação e minificação Mix CSS (complemento para Webpack), exigem o tempo de execução do servidor JavaScript Node.Js e o gerenciador de pacotes npm baseado em JavaScript. O Debian Linux Stable que estou usando já possui o pacote npm . No entanto, é uma versão bastante antiga e não é adequada para a infraestrutura do Laravel 5.5. Eu descubro como instalar a partir de fontes de terceiros, encontro deb.nodesource.com, instalo a partir dele. Hmm, estranho, no mesmo pacote, o npm é instalado junto com o Node.Js. Esta não é uma maneira Unix, mas tudo bem. A principal coisa que funciona.


Layout


A idéia do projeto QrCall.org é chamar o usuário através de um código QR . E isso significa que os visitantes entrarão no site a partir de dispositivos móveis, usando as câmeras nas quais esse código QR será digitalizado. Ao mesmo tempo, é provável que o registro do usuário, a configuração de alertas e a impressão de códigos QR sejam feitos em computadores desktop. Portanto, o layout adaptável é indispensável.


Percebo imediatamente a geração de conteúdo para celular / desktop no servidor analisando o UserAgent. Esta não é a nossa abordagem para 2019. Aqui, a estrutura CSS do Bootstrap nos ajudará definitivamente. Em geral, o layout dos aplicativos da Web é um tópico amplo, gigantesco e separado, que deve ser tratado por um especialista separado. Para mim, no desenvolvimento web, não há nada mais complicado do que escolher com layout. Há muito tempo entendo que tenho imponente cretinismo. Eu gasto uma quantidade enorme de tempo para recuar outro regular, ou para alinhar vários elementos. Mas como não temos recursos para o codificador, você deve fazer o que puder, pois é desejável que o resultado seja suave e bonito.


A questão é: qual versão do Bootstrap devo usar? 3 ou 4? Acontece que o Bootstrap vem imediatamente junto com o Laravel 5.5, e esta é a versão 3.x. Não há tempo para descobrir como refazer o ambiente no Bootstrap 4, então deixo a versão 3. No final, centenas de milhares de sites usam o Bootstrap 3 na Internet, o que significa que é uma tecnologia decente.


O mais interessante é que, como resultado, acabou criando um layout adaptável não apenas para a parte "aberta" do site, mas também para sua conta pessoal.


Aqui está a aparência da página na versão para desktop:



E aqui está ela na visualização móvel:



Desenvolvimento


Como a estrutura será usada? Eu tenho essa abordagem: ao máximo, use todos os componentes prontos do freverka, mas com uma condição: se houver um bom entendimento de como esse componente funciona. Como uma pessoa que já conhecia Zen Laravel disse: "Não se trata do fato de a documentação ser escrita em não-russo, mas do fato de que mesmo em inglês nativo para a estrutura nem sempre é indicativo". Portanto, acredito que, se você não conseguir descobrir rapidamente um componente ou método, é melhor fazer algo mais simples com seus próprios métodos do que escrever um código pouco compreendido por você.


Do que estou falando? A estrutura do Laravel é uma estrutura grande, com muitas abstrações implementadas e com uma abordagem própria da estrutura do código. Tem coisas simples que há muito tempo foram usadas com sucesso no Laravel e em outras estruturas. Existem coisas complexas, mas compreensíveis, por exemplo, a implementação de filas (que terão que ser usadas para telefonia). Mas há coisas fundamentais realmente complexas nas quais você não poderá penetrar. Por exemplo, este é um contêiner de serviço de pacote configurável + provedor de serviços + fachada. Até agora, eu entendi como criar mecanicamente um provedor de serviços, colocá-lo em um contêiner de serviço e parafusar a fachada em tudo. Mas pelo que precisa ser feito - ainda não percebi. Parece que essa abordagem reduz o código; você pode consultar a abstração e seus métodos em um estilo estático, sem usar a nova palavra-chave (mérito duvidoso). E o uso de fachadas facilita a organização de testes automatizados de um aplicativo Web e, como efeito colateral de toda essa conveniência, ao usar um provedor de serviços, a injeção de dependência é automatizada. Em geral, embora não haja entendimento, é mais fácil fazer as aulas auxiliares de sempre, o que eu faço.


Tecnologia


Então, para resumir o exposto, obtive a seguinte pilha de tecnologia bastante tradicional:


  • SO: Linux (eu escolho o Debian Stable)
  • Idioma: PHP7
  • Estrutura: Laravel
  • Assobios de front-end: Bootstrap 3 + Vue.js
  • Banco de Dados: MariaDB (aka MySQL)
  • Servidor Web: NGinx
  • Telefonia: SIP + linphonec / linphonecsh
  • VCS: Git

Sim, não é a pilha mais elegante e avançada. Mas precisamos fazer negócios, e não praticar a quebra do ambiente em contêineres do Docker e não promover a idéia de desenvolvimento somente para JS.


Fila


As filas são uma área de assunto muito específica e, em grandes equipes, as filas geralmente são respondidas por um especialista especialmente treinado que garante a operação de filas em centenas de servidores. No nosso caso, centenas de servidores não são observados; portanto, é necessário usar a fila da maneira mais simples possível e nos negócios. Portanto, como repositório de tarefas, decidi usar o mecanismo de banco de dados relacional do MySQL já usado no projeto. Havia alguma tentação de fazê-lo com sabedoria, por exemplo, com base no Redis, mas simplesmente não havia tempo para lidar com esse banco de dados NoSQL.


Durante o desenvolvimento, apareceu uma solicitação para uma tarefa que não pôde ser resolvida diretamente usando a fila do MySQL, mas que seria resolvida usando o Redis. O problema era que, após a conclusão bem-sucedida da tarefa, a tarefa é removida da fila e não há como verificar se, por exemplo, uma determinada tarefa foi concluída nos últimos 10 minutos? Ao usar o armazenamento Redis, isso pode ser implementado através do Limite de taxa, mas ao usar o MySQL, isso não é possível. Portanto, eu tive que implementar essa funcionalidade simplesmente com base nas análises do log de ações. Felizmente, o log de ações é uma parte indispensável do nosso pequeno sistema de informações.


Serviços Pagos


Ao colocar um site na Internet, você deve pagar o pagamento de vários serviços. Hospedagem e nome de domínio são sempre pagamentos quase obrigatórios. Pegamos a hospedagem de forma barata, pagamos 2 GB de RAM, à taxa de 1 GB pelo banco de dados e o restante - pelo sistema operacional e pela execução do script. Havia dois núcleos de microprocessador na tarifa, embora eu ache que alguém se sairia bem com nossas cargas. O espaço em disco em 20Gb é mais que suficiente para o nosso projeto. Durante o processo de implantação, foi necessária a compilação do linphonec , porque na área de trabalho do desenvolvedor havia um Linux Debian mais antigo do que na imagem final da máquina virtual fornecida pelo hoster, e o pacote padrão do repositório continha uma versão antiga deste programa com vários "recursos" desagradáveis. E assim, para compilar o linphonec, 2 GB não foi suficiente para mim. A magia dos modelos em C ++ está consumindo memória como se não estivesse dentro de si, então tive que configurar uma troca, após a qual a montagem foi concluída com êxito.


A telefonia SIP também nunca foi gratuita, mas como existem várias grandes operadoras de telefonia IP na Rússia que competem entre si e oferecem tarifas de custo muito baixo. O único momento incompreensível foi que, ao pedir uma tarifa, o operador convenceu que a tarifa seria por segundo, mas na verdade acabou por ser por minuto. Mas isso deve ser tratado separadamente.


Em nossas realidades modernas, você não pode confiar no fato de que existem serviços gratuitos de e-mail. E, no nosso caso, a newsletter por e-mail é necessária para enviar vários alertas. Na minha experiência, todas as tentativas de organizar o envio de muitas cartas pelo Yandex.Mail ou pelo Google.Mail apenas levam ao fato de que os servidores de email de recebimento, após três ou quatro letras, marcam as mensagens como spam. Ou seja, os problemas já surgem no estágio de depuração, sem mencionar a produção. Portanto, tive que me preocupar com o serviço Mailgun, através do qual as cartas são entregues rapidamente e sem problemas. Há apenas um mal-entendido com a Mailgun: em alguns artigos eles escrevem que dão gratuitamente enviar 10.000 cartas por mês. E no site da Mailgun em si é de alguma forma escorregadio escrito que eu entendo como 10.000 cartas desde o momento do registro. , , .


Mailgun . , , . , , SMTP. Laravel Mailgun, .



, . INPUT . . , SSH, . — DROP INPUT. , , .


SIP-, SIP- , , nf_conntrack_sip . , NAT, nf_nat_sip , , .



, . . — , , MySQL. — , . zip-, , , . — . rsync.


, — , borg . , .



GIT , , . . , , , ( ), - ( git , artisan ). /etc/sudoers , , .


, Laravel , . , , . , .


, ! — . ? : ! , CI . , , CI-, -.



. , ? ! - ? , ! . , .


, Laravel, CSS- Bootstrap 3 Bootstrap 4. - Bootstrap 4 Bootstrap 3, flex- , Bootstrap 3 , . Bootstrap 4, , .


, , HTTPS. , , . HTTP HTTPS, Let's Encrypt HTTPS - NGinx , .


, . , , . , , logrotate , .


. , , . -, . , . , , . , Laravel , , , . , , , .


Sumário


, " " " ". , . , , , , : , , , ( , , ).


? "". ? -, , . , , , , . , .


, , " , , " , . . ++ , . : , " ", , , , , . -. - , . , , . - : , - , , , .


— , - , , , . , proof-of-concept, , , , . , — , .


, - . , , . , - , , -. , , , ...


? : -, , , , , .

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


All Articles