como funciona a gestão da cadeia de suprimentos da empresa e-commerce netshoes?
um dos grandes nomes do e-commerce no brasil, a netshoes já se consagrou no mercado como a maior loja esportiva do mundo eletrônico. como todo case bem sucedido, não existe segredo para o seu bom desempenho nesses dez anos de atuação. o sucesso da loja é resultado de muito investimento, estudo de mercado, atenção e respeito com o seu público.

um dos objetivos da marca é conscientizar seus clientes a respeito do valor dos serviços oferecidos. “a intenção é que o consumidor veja o frete como um valor agregado e pague por ele. a entrega no mesmo dia custa o mesmo que o estacionamento de um shopping center numa grande capital”, diz graciela tanaka, diretora de operações da netshoes.

a netshoes utiliza uma estrutura logística própria, com processos simples. assim, ela consegue preparar os pedidos em até duas horas após a aprovação do pagamento. a empresa também conta com outros três centros de distribuição: dois em são paulo (barueri e itapevi) e um no pernambuco (jaboatão dos guararapes).

e se a logística era parte do fluxo operacional do e-commerce, agora ela faz parte da cartela de serviços oficialmente prestados pela netshoes.a empresa fechou um acordo para coordenar a operação logística de empresa de suplementos alimentares midway labs. a netshoes será responsável pela distribuição de mais de 150 produtos da empresa americana nos próximos cinco anos.a midway usará três dos centros de distribuição da netshoes. além dos serviços logísticos, a loja terá exclusividade na distribuição da military trail, linha de produtos da midway fabricada nos estados unidos.
<h1>prefácio</h1><p>esta é realmente uma tarefa assustadora, e há muito o que abordar. portanto, estou humildemente sugerindo isso como um guia abrangente para sua equipe, com dicas para ferramentas e material educacional apropriados.</p><p><em> <strong> lembre-se: </strong> estas são <strong> diretrizes </strong> e que, como tal, devem ser adotados, adaptados ou descartados com base nas circunstâncias. </em></p><p><em> <strong> cuidado: </strong> despejar tudo isso em uma equipe ao mesmo tempo provavelmente falhará. você deve tentar escolher elementos que dariam o melhor retorno possível e apresentá-los lentamente, um de cada vez. </em></p><p><em> <strong> nota: </strong> nem tudo isso se aplica diretamente a sistemas de programação visual como o g2. para obter detalhes mais específicos sobre como lidar com eles, consulte a seção <strong> adendo </strong> no final. </em></p><hr><h1>resumo executivo para o impaciente</h1><ul> <li>defina uma estrutura rígida do projeto <strong> </strong>, com: <ul> <li><strong> modelos de projeto </strong>,</li> <li><strong> convenções de codificação </strong>,</li> <li>sistemas familiares <strong> de construção </strong>,</li> <li>e conjuntos de <strong> diretrizes de uso </strong> para sua infraestrutura e ferramentas.</li> </ul> </li> <li>instale um bom <strong> [~ # ~] scm [~ # ~] </strong> e verifique se eles sabem como usá-lo.</li> <li>aponte-os para bons <strong> ides </strong> para sua tecnologia e verifique se eles sabem como usá-los.</li> <li>implemente <strong> verificadores de qualidade de código </strong> e <strong> relatórios automáticos </strong> no sistema de construção.</li> <li>acople o sistema de construção a <strong> integração contínua </strong> e <strong> sistemas de inspeção contínua </strong>.</li> <li>com a ajuda do acima, identifique <strong> código de qualidade "hotspots" </strong> e <strong> refator </strong>.</li> </ul><p><em> agora, para a versão longa ... cuidado, preparem-se! </em></p><hr><h1>a rigidez é (geralmente) boa</h1><p><em> esta é uma opinião controversa, pois a rigidez é frequentemente vista como uma força trabalhando contra você. é verdade para algumas fases de alguns projetos. mas uma vez que você o vê como um suporte estrutural, uma estrutura que elimina as suposições, reduz bastante a quantidade de tempo e esforço desperdiçados. faça com que funcione para você, não contra você. </em></p><p><em> rigidez </em> = <em> processo </em>/<em> procedimento </em>.</p><p>o desenvolvimento de software precisa de bons processos e procedimentos pelas mesmas razões pelas quais as fábricas ou fábricas de produtos químicos possuem manuais, procedimentos, exercícios e diretrizes de emergência: prevenção de maus resultados, aumento da previsibilidade, maximização da produtividade ...</p><p><strong> embora a rigidez seja moderada! </strong></p><h2>rigidez da estrutura do projeto</h2><p>se cada projeto vem com sua própria estrutura, você (e os novatos) estão perdidos e precisam começar do zero toda vez que os abrir. você não quer isso em uma loja de software profissional e também não quer isso em um laboratório.</p><h2>rigidez dos sistemas de construção</h2><p>se cada projeto <strong> parecer </strong> diferente, há uma boa chance de que eles também <strong> sejam construídos de forma diferente </strong> . uma construção não deve exigir muita pesquisa ou muita adivinhação. você quer fazer a coisa canônica e não precisa se preocupar com detalhes: <code>configure; make install</code>, <code>ant</code>, <code>mvn install</code>, etc ...</p><p>a reutilização do mesmo sistema de construção e a sua evolução ao longo do tempo também garantem um nível consistente de qualidade.</p><p>você precisa de um <code>readme</code> rápido para apontar as especificidades do projeto e orientar graciosamente o usuário/desenvolvedor/pesquisador, se houver.</p><p>isso também facilita muito outras partes da sua infraestrutura de construção, a saber:</p><ul> <li> <a href="http://en.wikipedia.org/wiki/continuous\_integration">integração contínua</a> ,</li> <li> <a href="http://www.ibm.com/developerworks/java/library/j-ap08016/index.html">inspeção contínua</a> .</li> </ul><p>portanto, mantenha sua construção (como seus projetos) atualizada, mas torne-a mais rígida ao longo do tempo e mais eficiente na denúncia de violações e práticas inadequadas.</p><p>não reinvente a roda e reutilize o que você já fez.</p><p><strong> leitura recomendada: </strong></p><ul> <li><em> <a href="http://rads.stackoverflow.com/amzn/click/0321336380">integração contínua: melhorando a qualidade do software e reduzindo riscos</a> </em> (duval, matyas, glover, 2007)</li> <li><em> entrega contínua: lançamentos de sotware através da automação de compilação, teste e implantação </em> (humble, farley, 2010)</li> </ul><h2>rigidez na escolha das linguagens de programação</h2><p>você não pode esperar, especialmente em um ambiente de pesquisa, que todas as equipes (e menos ainda todos os desenvolvedores) usem a mesma pilha de linguagem e tecnologia. no entanto, você pode identificar um conjunto de ferramentas "oficialmente suportadas" e incentivar o uso delas. o resto, sem uma boa justificativa, não deve ser permitido (além da prototipagem).</p><p>mantenha sua pilha de tecnologia simples e a manutenção e a amplitude das habilidades necessárias ao mínimo: um núcleo forte.</p><h2>rigidez das convenções e diretrizes de codificação</h2><p>as convenções e diretrizes de codificação são o que permitem que você desenvolva uma identidade como equipe e um jargão compartilhado <em> </em>. você não deseja errar <em> terra incognita </em> toda vez que abrir um arquivo de origem.</p><p>regras absurdas que tornam a vida mais difícil ou proíbem ações explicitamente, na medida em que os commits são recusados ​​com base em violações simples e simples, são um fardo. contudo:</p><ul> <li> <p>um conjunto de regras básicas bem pensado elimina grande parte dos gemidos e pensamentos: <strong> ninguém </strong> deve quebrar sob nenhuma circunstância;</p> </li> <li> <p>e um conjunto de regras recomendadas fornece orientações adicionais.</p> </li> </ul><blockquote> <p><strong> abordagem pessoal: </strong> sou agressivo quando se trata de convenções de codificação, alguns até dizem <em> nazi </em>, porque eu acredito em ter uma <em> lingua franca </em>, um estilo reconhecível para minha equipe. quando o código de porcaria é verificado, ele se destaca como uma afta na face de uma estrela de hollywood: desencadeia uma revisão e uma ação automaticamente. de fato, às vezes fui longe em defender o uso de ganchos pré-confirmação para rejeitar confirmações não conformes. como mencionado, não deve ser muito louco e atrapalhar a produtividade: deve impulsioná-lo. apresente-os lentamente, especialmente no começo. mas é preferível gastar tanto tempo corrigindo códigos defeituosos que você não pode trabalhar em problemas reais.</p> </blockquote><p>alguns idiomas ainda impõem isso por design:</p><ul> <li>o java foi criado para reduzir a quantidade de porcaria que você pode escrever com ele (embora sem dúvida muitos consigam fazê-lo).</li> <li> <p>a estrutura de blocos do python por indentação é outra idéia nesse sentido.</p> </li> <li> <p>vá, com sua ferramenta <code>gofmt</code>, que tira completamente qualquer debate e esforço (<strong> e ego !! </strong>) inerentes ao estilo: run <code>gofmt</code> antes de você confirmar.</p> </li> </ul><p>certifique-se de que <strong> a podridão do código </strong> não pode passar despercebida. <strong> convenções de código </strong>, <strong> integração contínua </strong> e <strong> inspeção contínua </strong>, <strong> programação de pares </strong> e <strong> análises de código </strong> é o seu arsenal contra esse demônio.</p><p>além disso, como você verá abaixo, o código <strong> é a documentação </strong>, e essa é outra área em que as convenções incentivam a legibilidade e a clareza.</p><h2>rigidez da documentação</h2><p>a documentação anda de mãos dadas com o código. o próprio código é documentação. mas deve haver instruções claras sobre como construir, usar e manter as coisas.</p><p>usar um único ponto de controle para documentação (como um wikiwiki ou dms) é uma coisa boa. crie espaços para projetos, espaços para brincadeiras e experiências mais aleatórias. todos os espaços reutilizam regras e convenções comuns. tente fazer parte do espírito de equipe.</p><p><em> a maioria dos conselhos aplicáveis ​​ao código e às ferramentas também se aplica à documentação. </em></p><h3>rigidez nos comentários do código</h3><p>comentários de código, como mencionado acima, também são documentação. os desenvolvedores gostam de expressar seus sentimentos sobre o código (principalmente orgulho e frustração, se você me perguntar). portanto, não é incomum que eles os expressem em termos inequívocos nos comentários (ou mesmo no código), quando um pedaço de texto mais formal poderia ter transmitido o mesmo significado com menos palavrões ou drama. não há problema em deixar passar alguns por motivos divertidos e históricos: também faz parte do <strong> desenvolvimento de uma cultura de equipe </strong>. mas é muito importante que todos saibam o que é aceitável e o que não é, e esse ruído de comentário é apenas isso: <strong> ruído </strong>.</p><h3>rigidez nos logs de consolidação</h3><p>os registros de confirmação não são uma "etapa" irritante e inútil do ciclo de vida do seu scm: você não o pula para chegar em casa a tempo ou prosseguir com a próxima tarefa, ou para conversar com os amigos que foram almoçar. eles são importantes e, como (a maioria) bom vinho, quanto mais o tempo passa, mais valiosos eles se tornam. então faça-os direito. fico espantado quando vejo colegas de trabalho escrevendo frases de efeito para commits gigantes ou para hacks não óbvios.</p><p>as confirmações são feitas por um motivo, e esse motivo nem sempre é expresso claramente pelo seu código e pela única linha do log de confirmação que você inseriu. há mais do que isso.</p><p><strong> cada linha de código tem uma história <em> </em> e uma história <em> </em> </strong> os diffs podem contar sua história, mas você deve escrever sua história.</p><blockquote> <p>por que atualizei esta linha? -&gt; porque a interface mudou.</p> <p>por que a interface mudou? -&gt; como a biblioteca l1 que o definiu foi atualizada.</p> <p>por que a biblioteca foi atualizada? -&gt; como a biblioteca l2, necessária para o recurso f, dependia da biblioteca l1.</p> <p>e qual é o recurso x? -&gt; ver tarefa 3456 no rastreador de problemas.</p> </blockquote><p>não é minha escolha de scm e também pode não ser a melhor para o seu laboratório; mas <code>git</code> acerta isso e tenta forçá-lo a escrever bons logs mais do que a maioria dos outros sistemas scms, usando <code>short logs</code> e <code>long logs</code>. vincule o id da tarefa (sim, você precisa de um) e deixe um resumo genérico para o <code>shortlog</code> e expanda no log longo: escreva a história do changeset <strong> </strong>.</p><p><strong> é um log: </strong> está aqui para acompanhar e registrar as atualizações.</p><blockquote> <p><strong> regra geral: </strong> se você procurou algo sobre essa alteração posteriormente, é provável que seu registro responda à sua pergunta?</p> </blockquote><h3>projetos, documentação e código estão vivos</h3><p>mantenha-os sincronizados, caso contrário eles não formarão mais essa entidade simbiótica. faz maravilhas quando você tem:</p><ul> <li>clear confirma registros no seu scm, com links para ids de tarefas no rastreador de problemas,</li> <li>onde os tickets desse rastreador estão vinculados aos conjuntos de alterações no seu scm (e possivelmente às compilações no seu sistema de ic),</li> <li>e um sistema de documentação vinculado a todos eles.</li> </ul><p><strong> o código e a documentação precisam ser coesos </strong>.</p><h2>rigidez nos testes</h2><blockquote> <p><strong> regras de ouro: </strong></p> <ul> <li>qualquer novo código deve vir com (pelo menos) testes de unidade.</li> <li>qualquer código legado refatorado deve vir com testes de unidade.</li> </ul> </blockquote><p>obviamente, eles precisam:</p><ul> <li>para testar algo valioso (ou é um desperdício de tempo e energia),</li> <li>para ser bem escrito e comentado (como qualquer outro código que você faz check-in).</li> </ul><p>eles também são documentação e ajudam a delinear o contrato do seu código. especialmente se você usar <a href="http://en.wikipedia.org/wiki/test-driven\_development"> tdd </a> . mesmo se não, você precisa deles para sua paz de espírito. eles são sua rede de segurança quando você incorpora um novo código (manutenção ou recurso) e sua torre de vigia para se proteger contra a podridão do código e falhas ambientais.</p><p>obviamente, você deve ir além e ter <a href="http://en.wikipedia.org/wiki/integration\_testing">testes de integração</a> e <a href="http://en.wikipedia.org/wiki/regression\_testing">testes de regressão</a> para cada bug reproduzível corrigido.</p><h2>rigidez no uso das ferramentas</h2><p>não há problema em um desenvolvedor/cientista ocasional querer experimentar algum novo verificador estático na fonte, gerar um gráfico ou modelo usando outro ou implementar um novo módulo usando uma dsl. mas é melhor se houver um conjunto canônico de ferramentas que <strong> todos os membros da equipe </strong> devem conhecer e usar.</p><p>além disso, permita que os membros usem o que querem, desde que sejam todos:</p><ul> <li><strong> produtivo </strong>,</li> <li><strong> não requer assistência regularmente </strong></li> <li><strong> não se ajusta regularmente à sua infraestrutura geral </strong>,</li> <li><strong> não interrompe sua infraestrutura </strong> (modificando áreas comuns como código, sistema de compilação, documentação ...),</li> <li><strong> não afeta o trabalho de outras pessoas </strong>,</li> <li><strong> capaz de executar oportuna qualquer tarefa solicitada </strong>.</li> </ul><p>se não for esse o caso, imponha que eles retornem aos padrões.</p><hr><h2>rigidez vs versatilidade, adaptabilidade, prototipagem e emergências</h2><p>flexibilidade pode ser boa. permitir que alguém ocasionalmente use um hack, uma abordagem rápida e suja ou uma ferramenta favorita para <strong> fazer o trabalho </strong> é bom. <strong> [~ # ~] nunca [~ # ~] </strong> deixe que se torne um hábito e <strong> [~ # ~] nunca [~ # ~] </strong> deixe esse código se tornar a base de código real para suportar.</p><hr><h1>questões de espírito de equipe</h1><h3>desenvolva um senso de orgulho em sua base de código</h3><ul> <li>desenvolva um senso de orgulho no código <ul> <li>use wallboards <ul> <li>quadro de líderes para um jogo de integração contínua</li> <li>wallboards para gerenciamento de problemas e contagem de defeitos</li> </ul> </li> <li>use um <a href="http://en.wikipedia.org/wiki/issue\_tracking\_system">rastreador de problemas</a> / <a href="http://en.wikipedia.org/wiki/bug\_tracking\_system">rastreador de erros</a> </li> </ul> </li> </ul><h3>evite jogos de culpa</h3><ul> <li>não use jogos de integração contínua/inspeção contínua: promove boas maneiras e <a href="http://www.codinghorror.com/blog/2009/05/how-to-motivate-programmers.html">competição produtiva</a> .</li> <li>não acompanhe os defeitos: é apenas uma boa manutenção da casa.</li> <li>do <strong> identificando causas-raiz </strong>: são apenas processos à prova de futuro.</li> <li>mas não <a href="https://softwareengineering.stackexchange.com/questions/83038/who-is-responsible-for-defects-found-during-development">atribuir culpa</a> : é contraproducente.</li> </ul><h3>é sobre o código, não sobre os desenvolvedores</h3><p>torne os desenvolvedores conscientes da qualidade de seu código, mas faça com que eles vejam o código como uma entidade independente e não como uma extensão de si mesmos, que não pode ser criticada.</p><p>é um paradoxo: você precisa incentivar <a href="http://www.codinghorror.com/blog/2006/05/egoless-programming-you-are-not-your-job.html">programação sem ego</a> para um ambiente de trabalho saudável, mas confiar no ego para fins motivacionais.</p><hr><h1>de cientista a programador</h1><p>pessoas que não valorizam e se orgulham do código não produzem um bom código. para que essa propriedade surja, eles precisam descobrir o quão valioso e divertido pode ser. simples profissionalismo e desejo de fazer o bem não são suficientes: é preciso paixão. então você precisa transformar seus cientistas em <strong> programadores </strong> (no sentido amplo).</p><p>alguém argumentou nos comentários que, após 10 a 20 anos em um projeto e seu código, qualquer um se sentiria apegado. talvez eu esteja errado, mas suponho que tenham orgulho dos resultados do código e do trabalho e seu legado, não do código em si ou do ato de escrevê-lo.</p><p>por experiência, a maioria dos pesquisadores considera a codificação uma necessidade ou, na melhor das hipóteses, uma distração divertida. eles só querem que funcione. aqueles que já são bastante versados ​​e têm interesse em programação são muito mais fáceis de persuadir a adotar as melhores práticas e a alternar tecnologias. você precisa levá-los até a metade do caminho.</p><hr><h1>manutenção de código faz parte do trabalho de pesquisa</h1><p>ninguém lê documentos de pesquisa ruins. é por isso que eles são revisados ​​por pares, revisados, refinados, reescritos e aprovados uma e outra vez até que estejam prontos para publicação. o mesmo se aplica a uma tese <strong> e a uma base de código! </strong></p><p>deixe claro que a constante refatoração e atualização de uma base de código evita a podridão do código e reduz a dívida técnica, além de facilitar a reutilização e adaptação futuras do trabalho para outros projetos.</p><hr><h1>por que tudo isso??!</h1><p>por que nos preocupamos com tudo isso? para <strong> qualidade do código </strong>. ou é <strong> código de qualidade </strong> ...?</p><p>essas diretrizes visam direcionar sua equipe para esse objetivo. alguns aspectos fazem isso simplesmente mostrando-lhes o caminho e deixando-os fazer (o que é muito melhor) e outros os pegam pela mão (mas é assim que você educa as pessoas e desenvolve hábitos).</p><p>como você sabe quando a meta está ao seu alcance?</p><h2>qualidade é mensurável</h2><p>nem sempre é quantitativamente, mas <strong> é mensurável </strong>. como mencionado, você precisa desenvolver um senso de orgulho em sua equipe, e mostrar progresso e bons resultados é essencial. avalie a qualidade do código regularmente e mostre o progresso entre os intervalos e como isso é importante. faça retrospectivas para refletir sobre o que foi feito e como isso tornou as coisas melhores ou piores.</p><p>existem ótimas ferramentas para <strong> inspeção contínua </strong>. <a href="http://www.sonarsource.org/">sonar</a> sendo popular no mundo java, mas pode se adaptar a qualquer tecnologia; e há muitas outras. mantenha seu código sob o microscópio e procure-os insetos e micróbios irritantes irritantes.</p><hr><h1>mas e se meu código já for uma porcaria?</h1><p>todas as opções acima são divertidas e fofas como uma viagem a never land, mas não é tão fácil de fazer quando você já tem um monte de porcaria (fumegante e fedorento) e uma equipe relutante em mudar.</p><p>aqui está o segredo: <strong> você precisa começar em algum lugar </strong>.</p><blockquote> <p><strong> anedota pessoal: </strong> em um projeto, trabalhamos com uma base de código que pesava originalmente 650.000+ java loc, mais de 200.000 linhas de jsps, mais de 40.000 javascript loc e mais de 400 mbs de dependências binárias.</p> <p>após cerca de 18 meses, são 500.000 java loc <strong> (mais limpo) </strong>, 150.000 linhas de jsps e 38.000 javascript loc , com dependências de até 100 mb (e elas não estão mais no nosso scm!).</p> <p><strong> como fizemos? </strong> <em> acabamos de fazer todas as opções acima. ou tentou arduamente. </em></p> <p>é um esforço de equipe, mas lentamente <strong> injetamos </strong> em nossos regulamentos e ferramentas de processo para monitorar a freqüência cardíaca de nosso produto, enquanto apressadamente <strong> cortando </strong> a "gordura": código de porcaria, dependências inúteis ... não paramos todo o desenvolvimento para fazer isso: temos períodos ocasionais de relativa paz e sossego, onde são livres para enlouquecer na base de código e desmembrá-la, mas na maioria das vezes fazemos tudo por padrão para um modo de "revisão e refatoração" a cada chance que temos: durante construções, durante o almoço, durante corridas de erros, durante sexta-feira tardes ...</p> <p>houve alguns "trabalhos" grandes ... mudar nosso sistema de compilação de uma compilação ant gigante de 8500+ xml loc para uma compilação maven com vários módulos foi um deles. tivemos então:</p> <ul> <li>módulos claros (ou pelo menos já era muito melhor e ainda temos grandes planos para o futuro),</li> <li>gerenciamento automático de dependências (para manutenção e atualizações fáceis e remoção de depósitos inúteis),</li> <li>construções mais rápidas, fáceis e reproduzíveis,</li> <li>relatórios diários de qualidade.</li> </ul> <p>outra foi a injeção de "cintos de ferramentas utilitárias", embora tentássemos reduzir as dependências: o google guava e o apache commons diminuem o seu código e reduzem a superfície para erros no <strong> seu </strong> código muito.</p> <p>também convencemos nosso departamento de ti de que talvez o uso de nossas novas ferramentas (jira, fisheye, crisol, confluence, jenkins) fosse melhor do que as existentes. ainda precisamos lidar com alguns que desprezamos (qc, sharepoint e supportworks ...), mas foi uma experiência geral aprimorada, com um pouco mais de espaço.</p> <p>e todos os dias, agora há uma quantidade entre uma e dezenas de confirmações que lidam apenas com a correção e refatoração de coisas. ocasionalmente, quebramos coisas (você precisa de testes de unidade e é melhor escrevê-las <strong> antes de </strong> refatorar as coisas), mas no geral o benefício para o nosso moral e para o produto tem sido enorme. chegamos lá uma fração de uma porcentagem de qualidade de código por vez. <strong> e é divertido vê-lo aumentar !!! </strong></p> </blockquote><p><em> <strong> nota: </strong> novamente, a rigidez precisa ser abalada para abrir espaço para coisas novas e melhores. na minha anedota, nosso departamento de ti está parcialmente certo ao tentar impor <strong> algumas </strong> coisas sobre nós e errado para outras. ou talvez eles <strong> estivessem certos </strong>. as coisas mudam. prove que são as melhores maneiras de aumentar sua produtividade. <strong> execuções de avaliação e protótipos </strong> estão aqui para isso. </em></p><hr><h1>o ciclo de refatoração de código de espaguete incremental super secreto para uma qualidade incrível</h1><pre><code> ++ ++ | a n a l y z e +&gt;| i d e n t i f y | ++ +++ ^ | | v +++ ++ | c l e a n +&lt;| f i x | ++ ++ </code></pre><p>depois de ter algumas ferramentas de qualidade no seu cinto de ferramentas:</p><ol> <li> <p><strong> analise </strong> seu código com verificadores de qualidade de código.</p> <p>linters, analisadores estáticos ou o que você tem.</p> </li> <li> <p><strong> identifique </strong> seus <strong> pontos críticos </strong> hotspots and <strong> frutas penduradas baixas </strong>.</p> <p>as violações têm níveis de severidade, e grandes classes com um grande número de severidades são uma grande bandeira vermelha: assim, elas aparecem como "pontos de acesso" nos tipos de visualizações do radiador/mapa de calor.</p> </li> <li> <p><strong> corrija </strong> os pontos de acesso primeiro.</p> <p>maximiza seu impacto em um curto espaço de tempo, pois eles têm o maior valor comercial. idealmente, as violações críticas devem ser tratadas assim que aparecerem, pois são possíveis vulnerabilidades de segurança ou causas de travamento e apresentam um alto risco de induzir uma responsabilidade (e, no seu caso, mau desempenho para o laboratório).</p> </li> <li> <p><strong> limpe </strong> as violações de baixo nível com <strong> varreduras automatizadas de base de código </strong>.</p> <p>ele melhora a <strong> relação sinal-ruído </strong> para que você possa ver violações significativas no seu radar à medida que aparecem. geralmente, há um grande exército de pequenas violações no início, se elas nunca foram resolvidas e sua base de código foi deixada solta na natureza. eles não apresentam um "risco" real, mas prejudicam a legibilidade e a manutenção do código. corrija-os conforme você os encontra durante o trabalho em uma tarefa ou em grandes tarefas de limpeza com varreduras de código automatizadas, se possível. tenha cuidado com grandes varreduras automáticas, se você não tiver um bom conjunto de testes e sistema de integração. certifique-se de concordar com os colegas de trabalho o momento certo para executá-los para minimizar o aborrecimento.</p> </li> <li> <p><strong> repita </strong> até ficar satisfeito.</p> <p>o que, idealmente, você nunca deveria ser, se este ainda for um produto ativo: continuará evoluindo.</p> </li> </ol><h3>dicas rápidas para uma boa manutenção da casa</h3><ul> <li> <p><strong> quando no modo de hotfix </strong>, com base em uma solicitação de suporte ao cliente:</p> <ul> <li>geralmente, é uma prática recomendada <strong> [~ # ~] não [~ # ~] </strong> resolver outros problemas, pois você pode apresentar novos sem querer.</li> <li>vá até lá <strong> no estilo seal: entre, mate o bug, saia </strong> e envie seu patch. é uma greve cirúrgica e tática.</li> </ul> </li> <li> <p><strong> mas, para todos os outros casos </strong>, se você abrir um arquivo, tenha o dever de:</p> <ul> <li><em> definitivamente: </em> <strong> analise </strong> (faça anotações, envie relatórios de problemas),</li> <li><em> talvez: </em> <strong> limpe </strong> (limpeza de estilo e pequenas violações),</li> <li><em> idealmente: </em> <strong> refatorar </strong> (reorganizar grandes seções e seus vizinhos).</li> </ul> </li> </ul><p>apenas não se desvie para passar uma semana de um arquivo para outro e acabar com um maciço conjunto de milhares de correções, abrangendo vários recursos e módulos - isso dificulta o rastreamento futuro. um problema no código = um ticket no seu rastreador. às vezes, um conjunto de alterações pode afetar vários tickets; mas se isso acontecer com muita frequência, provavelmente você está fazendo algo errado.</p><hr><h1>adendo: gerenciando ambientes de programação visual</h1><h2>os jardins murados dos sistemas de programação sob medida</h2><p>vários sistemas de programação, como o g2 do op, são bestas diferentes ...</p><ul> <li> <p><strong> "código" sem fonte </strong></p> <p>freqüentemente, eles não dão acesso a uma representação textual do seu "código" fonte: ele pode ser armazenado em um formato binário proprietário ou talvez ele armazene coisas no formato de texto, mas as oculta. sistemas de programação gráfica sob medida não são incomuns em laboratórios de pesquisa, pois simplificam a automação de fluxos de trabalho repetitivos de processamento de dados.</p> </li> <li> <p><strong> sem ferramentas </strong></p> <p>além de seus próprios, é isso. você geralmente é limitado pelo ambiente de programação, pelo depurador, pelo intérprete, pelas ferramentas e formatos de documentação. eles são <strong> jardins murados </strong>, exceto se eventualmente capturarem o interesse de alguém motivado o suficiente para fazer engenharia reversa de seus formatos e criar ferramentas externas - se a licença permitir.</p> </li> <li> <p><strong> falta de documentação </strong></p> <p>muitas vezes, esses são sistemas de programação de nicho, usados ​​em ambientes bastante fechados. as pessoas que os usam frequentemente assinam ndas e nunca falam sobre o que fazem. as comunidades de programação para eles são raras. portanto, os recursos são escassos. você está preso à sua referência oficial, e é isso.</p> </li> </ul><p>a parte irônica (e muitas vezes frustrante) é que todas as coisas que esses sistemas fazem poderiam obviamente ser alcançadas usando linguagens de programação de uso geral e geral, e provavelmente muito mais eficientemente. mas isso requer um conhecimento mais profundo da programação, enquanto você não pode esperar que seu biólogo, químico ou físico (para citar alguns) saiba o suficiente sobre programação e muito menos tenha tempo (e desejo) para implementar (e manter) sistemas complexos, que podem ou não durar muito. pela mesma razão que usamos dsls, temos esses sistemas de programação sob medida.</p><blockquote> <p><strong> anedota pessoal 2: </strong> na verdade, eu mesmo trabalhei em uma delas. eu não fiz o link com a solicitação do op, mas o meu projeto era um conjunto de grandes partes interconectadas de software de processamento e armazenamento de dados (principalmente para pesquisa em bioinformática, saúde e cosméticos, mas também para negócios inteligência ou qualquer domínio que implique no rastreamento de grandes volumes de dados de pesquisa de qualquer tipo e na preparação de fluxos de trabalho de processamento de dados e etls). um desses aplicativos era, simplesmente, um visual ide que usava os sinos e os assobios usuais: interfaces de arrastar e soltar, espaços de trabalho de projeto com versão (usando arquivos de texto e xml para armazenamento de metadados)); drivers conectáveis ​​a fontes de dados heterogêneas e uma tela visual para projetar pipelines para processar dados de fontes de dados n e, no final, gerar saídas m transformadas e possíveis visualizações brilhantes e relatórios on-line complexos (e interativos). um pouco da síndrome do nih sob o pretexto de projetar um sistema adaptado às necessidades dos usuários.</p> <p>e, como você esperaria, é um sistema agradável, bastante flexível para suas necessidades, embora às vezes um pouco exagerado, para que você se pergunte "por que não usar ferramentas de linha de comando?" e, infelizmente, sempre liderando empresas de médio porte equipes trabalhando em grandes projetos para muitas pessoas diferentes, usando-o com diferentes "melhores" práticas.</p> </blockquote><h2>ótimo, estamos condenados! - o que fazemos sobre isso?</h2><p>bem, no final, todas as opções acima ainda são válidas. se você não conseguir extrair a maior parte da programação deste sistema para usar mais ferramentas e linguagens convencionais, "apenas" precisará adaptá-lo às restrições do seu sistema.</p><h3>sobre controle de versão e armazenamento</h3><p>no final, você quase sempre pode <strong> versão </strong> coisas, mesmo com o ambiente mais restrito e murado. na maioria das vezes, esses sistemas ainda vêm com suas próprias versões (o que, infelizmente, é bastante básico, e oferece apenas reverter para versões anteriores sem muita visibilidade, mantendo apenas os instantâneos anteriores). não é exatamente o uso de conjuntos de alterações diferenciais como o seu scm de escolha, e provavelmente não é adequado para vários usuários que enviam alterações simultaneamente.</p><p>mas, ainda assim, se eles fornecem essa funcionalidade, talvez a sua solução seja seguir nossas amadas diretrizes padrão do setor acima e transpor essas para este sistema de programação !!</p><p>se o sistema de armazenamento for um banco de dados, provavelmente expõe as funcionalidades de exportação ou pode ser feito backup no nível do sistema de arquivos. se estiver usando um formato binário personalizado, talvez você possa simplesmente tentar fazer a versão com um vcs que tenha um bom suporte para dados binários. você não terá controle refinado, mas pelo menos terá as costas protegidas contra catástrofes e terá um certo grau de conformidade com a recuperação de desastres.</p><h3>sobre o teste</h3><p>implemente seus testes na própria plataforma e use ferramentas externas e tarefas em segundo plano para configurar backups regulares. provavelmente, você inicia esses testes da mesma maneira que iniciaria os programas desenvolvidos com esse sistema de programação.</p><p>claro, é um trabalho de hacker e definitivamente não está de acordo com o que é comum na programação "normal", mas a idéia é se adaptar ao sistema enquanto tenta manter uma aparência de processo profissional de desenvolvimento de software.</p><h3>a estrada é longa e íngreme ...</h3><p>como sempre em ambientes de nicho e sistemas de programação sob medida, e conforme exposto acima, você lida com formatos estranhos, apenas um conjunto limitado (ou totalmente inexistente) de ferramentas possivelmente desajeitadas e um vazio no lugar de uma comunidade.</p><p><strong> a recomendação: </strong> tente implementar as diretrizes acima fora do seu sistema de programação sob medida, o máximo possível. isso garante que você possa confiar em ferramentas "comuns", que possuem suporte adequado e motivação da comunidade.</p><p><strong> a solução alternativa: </strong> quando isso não for uma opção, tente adaptar essa estrutura global à sua "caixa". a idéia é sobrepor esse modelo de boas práticas padrão do setor sobre o sistema de programação e tirar o melhor proveito dele. o conselho ainda se aplica: defina a estrutura e as melhores práticas, incentive a conformidade.</p><p>infelizmente, isso implica que você pode precisar mergulhar e fazer uma tremenda quantidade de trabalho nas pernas. assim...</p><p><strong> últimas palavras famosas e pedidos humildes: </strong></p><ul> <li><strong> documente </strong> tudo o que você faz.</li> <li><strong> compartilhe </strong> sua experiência.</li> <li><strong> código aberto </strong> qualquer ferramenta que você escrever.</li> </ul><p>ao fazer tudo isso, você irá:</p><ul> <li>não apenas aumenta suas chances de obter apoio de pessoas em situações semelhantes,</li> <li>mas também forneça ajuda a outras pessoas e promova discussões em torno de sua pilha de tecnologia.</li> </ul><p>quem sabe, você poderia estar no início de uma nova comunidade vibrante de <em> linguagem obscura x </em>. se não houver, inicie um!</p><ul> <li>faça perguntas sobre <a href="https://stackoverflow.com/">estouro da pilha</a> ,</li> <li>talvez até escreva uma proposta para um novo site stackexchange no <a href="http://area51.stackexchange.com/">área 51</a> .</li> </ul><p><strong> talvez seja bonito por dentro </strong>, mas <strong> ninguém tem idéia </strong> até agora, tão ajuda <strong> derrube esta parede feia </strong> e <strong> deixe que outras pessoas dêem uma espiada! </strong></p> iaew cara,cara para controlar o estoque tem varias coisas a considerar, valor, quatidade, tipo, etc. inicialmente sugiro você começar pelo cadastro do produto, o cadastro completo, valor, descrição,... <p>a idéia aqui é que a maioria de nós já <em> já </em> saiba <em> a maioria </em> do que está nesta lista. mas pode haver apenas um ou dois itens que você realmente não analisou antes, que não entende completamente, ou talvez nunca tenha ouvido falar.</p><p><strong> interface e experiência do usuário </strong></p><ul> <li>esteja ciente de que os navegadores implementam os padrões de maneira inconsistente e verifique se o site funciona razoavelmente bem em todos os principais navegadores. em um teste mínimo com relação a um <a href="https://en.wikipedia.org/wiki/gecko\_%28layout\_engine%29">gecko</a> engine recente ( <a href="http://firefox.com/">firefox</a> ), um mecanismo webkit ( <a href="http://www.apple.com/safari/">safari</a> e alguns navegadores móveis) , <a href="http://www.google.com/chrome">chrome</a> , seus navegadores <a href="https://en.wikipedia.org/wiki/internet\_explorer">ie suportados</a> (aproveite as <a href="http://www.microsoft.com/downloads/details.aspx?familyid=21eabb90-958f-4b64-b5f1-73d0a413c8ef&amp;displaylang=en">imagens vpc de compatibilidade de aplicativos</a> ) e <a href="http://www.opera.com/">opera</a> . considere também como <a href="http://www.browsershots.org">browsers processam seu site</a> / em diferentes sistemas operacionais.</li> <li>considere como as pessoas podem usar o site que não seja dos principais navegadores: telefones celulares, leitores de tela e mecanismos de pesquisa, por exemplo. - algumas informações de acessibilidade: <a href="http://www.w3.org/wai/"> wai </a> e <a href="http://www.section508.gov/">section508</a> , desenvolvimento móvel: <a href="http://mobiforge.com/">mobiforge</a> .</li> <li>preparo: como implantar atualizações sem afetar seus usuários. tenha um ou mais ambientes de teste ou teste disponíveis para implementar alterações na arquitetura, no código ou no conteúdo abrangente e garantir que eles possam ser implantados de maneira controlada sem quebrar nada. tenha uma maneira automatizada de implantar alterações aprovadas no site ativo. isso é implementado de maneira mais eficaz em conjunto com o uso de um sistema de controle de versão (git, subversion, etc.) e um mecanismo de compilação automatizado (ant, nant, etc.).</li> <li>não exiba erros hostis diretamente para o usuário.</li> <li>não coloque os endereços de email dos usuários em texto sem formatação, pois eles receberão spam até a morte.</li> <li>adicione o atributo \_<code>rel="nofollow"</code>\_ aos links gerados pelo usuário <a href="https://en.wikipedia.org/wiki/nofollow">para evitar spam</a> .</li> <li> <a href="http://www.codinghorror.com/blog/archives/001228.html">crie limites bem considerados no seu site</a> - isso também pertence a segurança.</li> <li>aprenda a fazer <a href="https://en.wikipedia.org/wiki/progressive\_enhancement">aprimoramento progressivo</a> .</li> <li> <a href="https://en.wikipedia.org/wiki/post/redirect/get">redirecione após um post</a> se esse post foi bem-sucedido, para impedir que uma atualização seja enviada novamente.</li> <li>não se esqueça de levar em consideração a acessibilidade. é sempre uma boa ideia e, em determinadas circunstâncias, é um <a href="http://www.section508.gov/">requisito legal</a> . <a href="http://www.w3.org/wai/intro/aria">wai-aria</a> e <a href="http://www.w3.org/tr/wcag20/">wcag 2</a> são bons recursos nessa área.</li> <li>leia <a href="http://www.sensible.com/dmmt.html">não me faça pensar</a> .</li> </ul><p><strong> segurança </strong></p><ul> <li>é muito difícil de digerir, mas o guia de desenvolvimento <a href="http://www.owasp.org/index.php/category:owasp\_guide\_project">owasp</a> cobre a segurança do site de cima para baixo.</li> <li>saiba mais sobre a injeção, especialmente <a href="https://en.wikipedia.org/wiki/sql\_injection">sql injection</a> e como evitá-la.</li> <li>nunca confie na entrada do usuário, nem em qualquer outra coisa que esteja presente na solicitação (que inclui cookies e valores ocultos do campo do formulário!).</li> <li>hash senhas usando <a href="https://security.stackexchange.com/q/21263/396">salt</a> / e use sais diferentes para suas linhas para evitar ataques do rainbow. use um algoritmo de hash lento, como bcrypt (tempo testado) ou scrypt (ainda mais forte, mas mais recente) ( <a href="http://www.tarsnap.com/scrypt.html">1</a> , <a href="http://it.slashdot.org/comments.pl?sid=1987632&amp;cid=35149842">2</a> ), para armazenar senhas. ( <a href="http://codahale.com/how-to-safely-store-a-password/">como armazenar com segurança uma senha</a> ). o <a href="https://security.stackexchange.com/q/7689/396">nist também aprova o pbkdf2 para senhas de hash</a> "e é <a href="https://security.stackexchange.com/a/2136/396">fips aprovado no .net</a> (mais informações <a href="https://security.stackexchange.com/questions/211/how-to-securely-hash-passwords">aqui</a> ) . <em> evite </em> usar md5 ou a família sha diretamente.</li> <li> <a href="https://stackoverflow.com/questions/1581610/how-can-i-store-my-users-passwords-safely/1581919#1581919">não tente criar seu próprio sistema de autenticação sofisticado</a> . é uma coisa tão fácil cometer erros de maneiras sutis e não testáveis ​​e você nem saberia até <em> depois de </em> ser invadido.</li> <li>conheça as <a href="https://www.pcisecuritystandards.org/">regras para o processamento de cartões de crédito</a> . ( <a href="https://stackoverflow.com/questions/51094/payment-processors-what-do-i-need-to-know-if-i-want-to-accept-credit-cards-on-m">veja também esta pergunta</a> )</li> <li>use <a href="http://www.mozilla.org/projects/security/pki/nss/ssl/draft302.txt">ssl/tls</a> / <a href="https://en.wikipedia.org/wiki/session\_hijacking#prevention"> https </a> para sites em que dados confidenciais são inseridos (como credenciais, informações de identificação pessoal, informações do cartão de crédito). <a href="https://letsencrypt.org">let's encrypt</a> é uma autoridade de certificação gratuita que pode ajudar.</li> <li> <a href="https://en.wikipedia.org/wiki/session\_hijacking#prevention">impedir o seqüestro de sessão</a> .</li> <li>evite <a href="https://en.wikipedia.org/wiki/cross-site\_scripting">scripts entre sites</a> (xss).</li> <li>evite <a href="https://en.wikipedia.org/wiki/cross-site\_request\_forgery">falsificações de solicitação entre sites</a> (csrf).</li> <li>evite <a href="https://en.wikipedia.org/wiki/clickjacking">clickjacking</a> .</li> <li>mantenha seu (s) sistema (s) atualizado (s) com as últimas correções.</li> <li>verifique se as informações de conexão do banco de dados estão protegidas.</li> <li>mantenha-se informado sobre as mais recentes técnicas de ataque e vulnerabilidades que afetam sua plataforma.</li> <li>leia <a href="https://code.google.com/archive/p/browsersec/">manual de segurança do navegador google</a> .</li> <li>leia <a href="https://rads.stackoverflow.com/amzn/click/com/0470170778">manual do hacker de aplicativos da web</a> .</li> <li>considere <a href="https://en.wikipedia.org/wiki/principle\_of\_least\_privilege">o princípio do menor privilégio</a> . tente executar o servidor de aplicativos <a href="https://security.stackexchange.com/questions/47576/do-simple-linux-servers-really-need-a-non-root-user-for-security-reasons">como não raiz</a> . ( <a href="http://tomcat.apache.org/tomcat-8.0-doc/security-howto.html#non-tomcat\_settings">exemplo do tomcat</a> )</li> <li>coloque \_<code>rel="noopener noreferrer"</code>\_ em todos os links fornecidos pelo usuário com \_<code>target="\_blank"</code>\_ para impedir que o javascript na página de destino redirecione sua página para outro lugar, como uma página de login falsa. <a href="https://dev.to/phishing">mais informações</a> </li> <li>considere usar uma <a href="https://csp.withgoogle.com/docs/index.html">política de segurança de conteúdo estrita</a> .</li> </ul><p><strong> desempenho </strong></p><ul> <li>implemente o cache, se necessário, entenda e use <a href="http://www.mnot.net/cache\_docs/">http caching</a> corretamente, bem como <a href="http://www.w3.org/tr/2011/wd-html5-20110525/offline.html">html5 manifest</a> .</li> <li>otimizar imagens - não use uma imagem de 20 kb para um fundo repetitivo.</li> <li>compactar conteúdo para velocidade, consulte <a href="https://www.smashingmagazine.com/2016/10/next-generation-server-compression-with-brotli/">brotli</a> , <a href="http://developer.yahoo.com/performance/rules.html#gzip">gzip/deflate</a> (<strike> <a href="https://stackoverflow.com/questions/1574168/gzip-vs-deflate-zlib-revisited">deflate é melhor</a> </strike>).</li> <li>combine/concatene várias folhas de estilo ou vários arquivos de script para reduzir o número de conexões do navegador e melhorar a capacidade do gzip para compactar duplicações entre arquivos.</li> <li>dê uma olhada no site <a href="http://developer.yahoo.com/performance/">yahoo exceptional performance</a> , muitas ótimas diretrizes, incluindo a melhoria do desempenho do front-end e sua <a href="http://developer.yahoo.com/yslow/">yslow</a> ferramenta (requer firefox, safari, chrome ou opera). além disso, <a href="https://developers.google.com/speed/docs/best-practices/rules\_intro">velocidade da página do google</a> (use com <a href="https://developers.google.com/speed/pagespeed/insights\_extensions">extensão do navegador</a> ) é outra ferramenta para criação de perfil de desempenho e otimiza suas imagens também.</li> <li><strike>use <a href="http://alistapart.com/articles/sprites">css image sprites</a> para imagens relacionadas pequenas, como barras de ferramentas (consulte o ponto "minimizar solicitações http")</strike></li> <li>use <a href="https://24ways.org/2014/an-overview-of-svg-sprite-creation-techniques/">sprites de imagem svg</a> para pequenas imagens relacionadas, como barras de ferramentas. a coloração svg é um pouco complicada. você pode ler sobre isso <a href="http://tympanus.net/codrops/2015/07/16/styling-svg-use-content-css/">aqui</a> .</li> <li>sites ocupados devem considerar <a href="http://developer.yahoo.com/performance/rules.html#split">dividir componentes entre domínios</a> . especificamente...</li> <li>o conteúdo estático (ou seja, imagens, css, javascript e, geralmente, o conteúdo que não precisa de acesso a cookies) deve ir em um domínio separado <em> <a href="http://blog.stackoverflow.com/2009/08/a-few-speed-improvements/">que não usa cookies</a> </em>, porque todos os cookies de um domínio e seus subdomínios são enviados com todas as solicitações para o domínio e seus subdomínios. uma boa opção aqui é usar uma rede de entrega de conteúdo (cdn), mas considere o caso em que essa cdn pode falhar incluindo cdns alternativas ou cópias locais que podem ser veiculadas.</li> <li>minimize o número total de solicitações http necessárias para um navegador renderizar a página.</li> <li>escolha um <a href="http://garann.github.io/template-chooser/">template engine</a> e renderize/pré-compile usando os executores de tarefas como gulp ou grunt</li> <li>verifique se há um arquivo \_<code>favicon.ico</code>\_ na raiz do site, ou seja, \_<code>/favicon.ico</code>\_. <a href="http://mathiasbynens.be/notes/rel-shortcut-icon">os navegadores solicitarão automaticamente</a> , mesmo que o ícone não seja mencionado no html. se você não tiver um \_<code>/favicon.ico</code>\_, isso resultará em muitos 404s, consumindo a largura de banda do servidor.</li> </ul><p><strong> seo (otimização de mecanismos de pesquisa) </strong></p><ul> <li>use urls "compatíveis com o mecanismo de pesquisa", ou seja, use \_<code>example.com/pages/45-article-title</code>\_ em vez de \_<code>example.com/index.php?page=45</code>\_</li> <li>ao usar \_<code>#</code>\_ para conteúdo dinâmico, altere \_<code>#</code>\_ para \_<code>#!</code>\_ e, em seguida, no servidor \_<code>$\_request["\_escaped\_fragment\_"]</code>\_, é o que o googlebot usa em vez de \_<code>#!</code>\_. em outras palavras, \_<code>./#!page=1</code>\_ se torna \_<code>./?\_escaped\_fragments\_=page=1</code>\_. além disso, para usuários que possam estar usando o ff.b4 ou o chromium, <code>history.pushstate({"foo":"bar"}, "about", "./?page=1");</code> é um ótimo comando. portanto, mesmo que a barra de endereço tenha mudado, a página não é recarregada. isso permite que você use \_<code>?</code>\_ em vez de \_<code>#!</code>\_ para manter o conteúdo dinâmico e também informar ao servidor quando você enviar por e-mail o link que estamos após esta página, e o ajax não precisa para fazer outro pedido extra.</li> <li>não use links que digam <a href="https://ux.stackexchange.com/questions/12100/why-shouldnt-we-use-the-word-here-in-a-textlink">"clique aqui"</a> . você está desperdiçando uma oportunidade de seo e isso torna as coisas mais difíceis para as pessoas com leitores de tela.</li> <li>tenha um <a href="http://www.sitemaps.org/">xml sitemap</a> , de preferência no local padrão \_<code>/sitemap.xml</code>\_.</li> <li>use <a href="http://googlewebmastercentral.blogspot.com/2009/02/specify-your-canonical.html">\_<code>&lt;link rel="canonical" ... /&gt;</code>\_</a> quando você tiver vários urls que apontam para o mesmo conteúdo, esse problema também pode ser solucionado em <a href="http://www.google.com/webmasters/">ferramentas do google para webmasters</a> .</li> <li>use <a href="http://www.google.com/webmasters/">ferramentas para webmasters do google</a> e <a href="http://www.bing.com/toolbox/webmaster">ferramentas para webmasters do bing</a> .</li> <li>instale <a href="http://www.google.com/analytics/">google analytics</a> logo no início (ou uma ferramenta de análise de código aberto como <a href="http://piwik.org/">piwik</a> /).</li> <li>saiba como <a href="https://en.wikipedia.org/wiki/robots\_exclusion\_standard">robots.txt</a> e as aranhas dos mecanismos de pesquisa funcionam.</li> <li>redirecione solicitações (usando \_<code>301 moved permanently</code>\_) solicitando \_<code>www.example.com</code>\_ para \_<code>example.com</code>\_ (ou o contrário) para impedir a divisão da classificação do google entre os dois sites.</li> <li>saiba que pode haver aranhas mal comportadas por aí.</li> <li>se você tiver conteúdo não textual, procure as extensões de mapa do site do google para vídeos, etc. há algumas informações boas sobre isso em <a href="https://stackoverflow.com/questions/72394/what-should-a-developer-know-before-building-a-public-web-site#167608">tim farley's answer</a> .</li> </ul><p><strong> tecnologia </strong></p><ul> <li>entenda <a href="http://www.ietf.org/rfc/rfc2616.txt"> http </a> e coisas como get, post, sessões, cookies e o que significa ser "sem estado".</li> <li>escreva seu <a href="http://www.w3.org/tr/xhtml1/"> xhtml </a> / <a href="http://www.w3.org/tr/rec-html40/"> html </a> e <a href="http://www.w3.org/tr/css2/"> css </a> de acordo com as especificações <a href="http://www.w3.org/tr/">w3c</a> e certifique-se de que eles <a href="http://validator.w3.org/">validam</a> /. o objetivo aqui é evitar os modos peculiares do navegador e, como bônus, facilitar o trabalho com navegadores não tradicionais, como leitores de tela e dispositivos móveis.</li> <li>entenda como o javascript é processado no navegador.</li> <li>entenda como o javascript, as folhas de estilo e outros recursos usados ​​por sua página são carregados e considere seu impacto no <em> desempenho percebido </em>. agora, é amplamente considerado adequado <a href="https://developer.yahoo.com/blogs/ydn/high-performance-sites-rule-6-move-scripts-bottom-7200.html">mover scripts para o final das páginas</a> das suas páginas, com exceções que normalmente são coisas como aplicativos de análise ou shims html5.</li> <li>entenda como a sandbox javascript funciona, especialmente se você pretende usar iframes.</li> <li>esteja ciente de que o javascript pode e será desativado e que ajax é, portanto, uma extensão, não uma linha de base. mesmo que a maioria dos usuários o deixe ligado agora, lembre-se de que <a href="http://noscript.net/">noscript</a> está se tornando mais popular. embora os robôs de rastreamento modernos suportem a indexação de conteúdo gerado por javascript, considere usar a renderização no servidor para outros robôs ou usuários que desativaram o javascript.</li> <li>aprenda a diferença <a href="http://www.bigoakinc.com/blog/when-to-use-a-301-vs-302-redirect/">entre os redirecionamentos 301 e 302</a> (esse também é um problema de seo).</li> <li>aprenda o máximo possível sobre sua plataforma de implantação.</li> <li>considere usar uma <a href="https://stackoverflow.com/questions/11578819/css-reset-what-exactly-does-it-do">redefinir folha de estilos</a> ou <a href="http://necolas.github.com/normalize.css/">normalize.css</a> .</li> <li>considere estruturas javascript (como <a href="http://jquery.com/">jquery</a> , <a href="http://mootools.net/">mootools</a> , <a href="http://www.prototypejs.org/">prototype</a> , <a href="http://dojotoolkit.org">dojo</a> ou <a href="http://developer.yahoo.com/yui/3/">yui 3</a> ), que ocultará muitas diferenças do navegador ao usar javascript para manipulação de dom.</li> <li>reunindo o desempenho percebido e as estruturas js, considere usar um serviço como a <a href="http://developers.google.com/speed/libraries/devguide">api das bibliotecas do google</a> para carregar estruturas para que um navegador possa usar uma cópia da estrutura que ele já armazenou em cache, em vez de fazer o download de uma cópia duplicada. copiar do seu site.</li> <li>não reinvente a roda. antes de fazer qualquer coisa, procure um componente ou exemplo de como fazê-lo. há 99% de chance de alguém ter feito isso e lançado uma versão oss do código.</li> <li>por outro lado, não comece com 20 bibliotecas antes mesmo de decidir quais são suas necessidades. particularmente na web do lado do cliente, onde quase sempre é mais importante manter as coisas leves, rápidas e flexíveis.</li> </ul><p><strong> correção de erros </strong></p><ul> <li>entenda que você gastará 20% do seu tempo codificando e 80% dele mantendo, portanto, codifique de acordo.</li> <li>configure uma boa solução de relatório de erros.</li> <li>tenha um sistema para as pessoas entrarem em contato com você com sugestões e críticas.</li> <li>documente como o aplicativo funciona para futuras equipes de suporte e pessoas que realizam manutenção.</li> <li>faça backups frequentes! (e verifique se esses backups estão funcionando) tenha uma estratégia de restauração, não apenas uma estratégia de backup.</li> <li>use um sistema de controle de versão para armazenar seus arquivos, como <a href="http://subversion.apache.org/">subversion</a> , <a href="http://mercurial.selenic.com/">mercurial</a> ou <a href="http://git-scm.org">git</a> .</li> <li>não se esqueça de fazer seu teste de aceitação. estruturas como <a href="http://seleniumhq.org/">selenium</a> podem ajudar. especialmente se você automatizar completamente seus testes, talvez usando uma ferramenta de integração contínua, como <a href="http://jenkins-ci.org/">jenkins</a> .</li> <li>verifique se você possui log suficiente usando estruturas como <a href="http://logging.apache.org/log4j/">log4j</a> , <a href="http://logging.apache.org/log4net/">log4net</a> ou <a href="http://log4r.rubyforge.org/">log4r</a> . se algo der errado no seu site ao vivo, você precisará descobrir como.</li> <li>ao fazer o log, certifique-se de capturar as exceções tratadas e não tratadas. relate/analise a saída do log, pois mostrará onde estão os principais problemas em seu site.</li> </ul><p><strong> outros </strong></p><ul> <li>implemente monitoramento e análise do lado do servidor e do cliente (um deve ser proativo em vez de reativo).</li> <li>use serviços como uservoice e intercom (ou qualquer outra ferramenta similar) para manter contato constante com seus usuários.</li> <li>siga <a href="http://nvie.com/about/">vincent driessen</a> 's <a href="http://nvie.com/posts/a-successful-git-branching-model/">git branching model</a> </li> </ul><p>muitas coisas foram omitidas não necessariamente porque não são respostas úteis, mas porque são muito detalhadas, estão fora do escopo ou vão um pouco longe demais para alguém que deseja obter uma visão geral do que deve saber. sinta-se à vontade para editar isso também, provavelmente perdi algumas coisas ou cometi alguns erros.</p> [imagem]

[502 bad gateway 05/12/2017](http://comunidade.lojaintegrada.com.br/t/502-bad-gateway-05-12-2017/15484) [erros](/c/erros)

[502]

olá lojistas!

detectamos um problema no catálogo das lojas que tem impactado sua disponibilidade.

nossa equipe de ti está trabalhando para reaver a estabilidade do sistema o mais breve possível.

atualizaremos nosso status… Olá [@Rafiusk](/c/user/viewprofilepage/user-id/636948),


 


Sou Amália da Shopify - obrigada por fornecer esses detalhes!


 


Pelo que vejo na tela que você compartilhou do seu live view, parece estar funcionando.  O [live view](https://help.shopify.com/pt-BR/manual/reports-and-analytics/shopify-reports/live-view) mostra os acessos e actividade em sua loja em tempo real.  Se você iniciou sua loja recentemente ou se ainda não fez marketing ou publicidade, é possível que ainda não esteja vendo muita atividade lá porque seu público pode ainda não saber que sua loja existe. Falando em seu público, eu dei uma olhada na sua oferta de produtos e notei que você está vendendo uma grande variedade de produtos. Quando se trata de atrair clientes a sua loja, é muito mais fácil quando se concentra em um nicho específico.  Recomendo conferir [este post aqui](https://pt.shopify.com/blog/nichos-de-mercado) que voce deve achar útil com maiores detalhes sobre como você pode restringir a sua oferta e seu publico.


 


Em relação à sua pergunta sobre o Facebook - gostaria de saber mais alguns detalhes para entender melhor o que está acontecendo. Por gentileza, poderia nos dizer por que você acredita que o Facebook está banindo os seus domínios? Você está tentando conectar sua Loja Shopify à sua conto do Facebook para que você possa vender produtos no Facebook também?


 


Aguardo sua resposta!


 


Até ja,



**Amália | Social Care @ Shopify**  
  - A minha resposta foi útil? Clique em **Curtir** para me dizer!  
  - Sua dúvida foi respondida? Clique em **Aceitar Solução**    
 - Para saber mais visite nossa [Central de Ajuda Shopify](https://help.shopify.com/pt-br/?&utm_source=community&utm_medium=web&utm_campaign=signature&utm_content=pt-br) ou nosso [Shopify Blog](https://help.shopify.com/pt-BR/?&utm_source=community&utm_medium=web&utm_campaign=signature&utm_content=pt-br) <p>olá marcos! veja bem, pode-se fazer uma analogia, em certo ponto, com um while, mas isso não é um while. em um while você faz a repetição de determinada regra de negócio de acordo com a condição por você indicada. no chain of responsibility, necessáriamente não será repetida a mesma regra de negócio, veja que cada classe tem sua própria verificação, ou seja regras de negócios diferentes.</p>
<p>mas eu entendi o que você quis dizer, você está se referindo ao fato de ficar repetindo a verificação enquanto uma não for atendida. por isso eu disse que dá para fazer uma analogia em certo ponto. mas repare que isso foi apenas uma coincidência, pois com o chain of responsibility eu não precisaria parar a verificação ao achar uma que atendesse a condição, poderia continuar com todas, ja com o while não.</p>
<p>enfim, para o caso do exercício e da aula é possível sim fazer essa analogia, mas tenha em mente que o chain of responsibility não é uma espécie de while.</p>
<p>espero ter ajudado! bons estudos!</p> muito bom atendimento... foi entregue em perfeitas condições. me atenderam muito bem, com atualizações quase todos os dias...
que deus os abençoe <p>você já está no caminho certo, o que complica é as companhias se repetirem, força a gente a criar agrupamentos que acaba aumentando a complexidade um pouco.</p>
<p>olha se esse código funciona:</p>
<pre class="prettyprint"><code># imports
import pandas as pd
import numpy as np
from datetime import datetime, timedelta

# essas 3 linhas são para somar o faturamento baseado no nome da companhia
# a gente modifica o index para que o &#34;total value&#34; seja retornado corretamente para cada companhia já que estamos agrupando para somar o &#34;value&#34;
dados.set\_index(&#39;company&#39;, inplace&#61;true)
dados[&#39;total value&#39;] &#61; dados.groupby(&#39;company&#39;).sum()[&#39;value&#39;]
dados.reset\_index(inplace&#61;true)

# variável que representa o último ano móvel
last\_year &#61; datetime.now() - timedelta(days&#61;365)

# criação do ranking
# o legal é que mesmo com uma seleção menor que o dataframe ele ainda cria a series rank para as companhias corretas e coloca o resto como nan
dados[&#39;rank&#39;] &#61; dados[dados[&#39;date&#39;] &gt; last\_year][&#39;total value&#39;].rank(ascending&#61;false, method&#61;&#39;dense&#39;)

# aplica os nomes definidos para o top 4
dados[&#39;top 4 last year&#39;] &#61; dados[&#39;rank&#39;].apply(lambda x: x if (x &lt;&#61; 4 or np.isnan(x)) else &#39;outras&#39;)

# aplica os nomes definidos para o top 5
dados[&#39;top 5 last year&#39;] &#61; dados[&#39;rank&#39;].apply(lambda x: x if (x &lt;&#61; 4 or np.isnan(x)) else 5)
dados[&#39;top 5 last year&#39;] &#61; dados[&#39;top 5 last year&#39;].apply(lambda x: x if np.isnan(x) else str(int(x)) &#43; &#39;º&#39;)

dados</code></pre>
<p>espero ter ajudado, se tiver alguma dúvida é só perguntar!</p> olá @paulo b,agradecemos a sua sugestão. trabalhamos todos os dias para dar aos nossos clientes os melhores produtos e serviços do mercado. esteja atento às novidades, assim que surjam, divulgamos nos canais habituais. 🙂 obrigado, produto ótimo, rápida entrega... 
facilidade de compra e um ótimo site organizado.
parabéns
deus te abençoe..