segunda-feira, 30 de dezembro de 2019

Por que sua equipe de software deve ser remota


Este artigo foi originalmente publicado pela indexcode.io

O futuro do trabalho é remoto, e em nenhum setor isso é mais verdadeiro do que em programação e desenvolvimento de software. Uma força de trabalho globalizada permite que as empresas utilizem as habilidades de programadores de todo o mundo, economizando tempo e dinheiro no processo. Muitas empresas, incluindo Stripe, ESPN e Coffee Meets Bagel, têm capitalizado em trabalhar com os principais desenvolvedores, não importa onde morem. Aqui estão alguns dos principais benefícios que as empresas obtêm trabalhando com equipes de software remotas.

Beneficie-se do aumento da produtividade 

Não são apenas as equipes de software: em geral, os funcionários remotos são mais produtivos. Uma pesquisa constatou que 77% dos trabalhadores eram mais produtivos ao trabalhar remotamente; 30% dos entrevistados relataram que "mais em menos tempo do que quando trabalhavam internamente".

Os desenvolvedores remotos de software ganham flexibilidade para trabalhar quando são mais produtivos. Nem todo mundo é mais produtivo entre as 9:00 e as 17:00. As equipes dispersas podem espalhar sua cobertura por 24 horas, concluindo tarefas quando cada pessoa é capaz de se concentrar e realizar seu melhor trabalho. Se houver um problema que precise ser resolvido imediatamente, há uma boa chance de alguém em um fuso horário diferente estar pronto para solucionar problemas. Para as empresas que pagam a cada desenvolvedor por hora, você está pagando por horas trabalhadas - não horas gastas em uma mesa olhando para o Facebook. Isso se traduz em um melhor trabalho pelo seu dinheiro.

Tenha acesso aos melhores talentos em todos os lugares

Quando um gerente de contratação recruta de um conjunto de candidatos em uma área geográfica imediata, sua capacidade de contratar o melhor desenvolvedor é limitada. Expandir sua equipe de software para um conjunto global de candidatos oferece à sua empresa o melhor ajuste possível para o projeto. De acordo com o Relatório de Habilidades para Desenvolvedores de 2019 da Hackerrank , "41% dos empregadores dizem que a falta de talentos é um problema que enfrentam ao contratar desenvolvedores". O recrutamento em todo o mundo permite que uma empresa contrate um engenheiro do Vale do Silício para trabalhar com um especialista em Java da Polônia e um desenvolvedor de software das Filipinas. Escassez de talentos: resolvida.

Economize nos custos dos funcionários 

Dependendo do nível da posição e da sua localização, custa em média US$ 4.000 para recrutar um novo funcionário. Desde a redação da descrição do cargo até a publicação do cargo e a contratação de alguém para entrevistar, os custos de contratação de uma equipe de software completa podem aumentar rapidamente.

As empresas economizam nos custos de realocação e recrutamento e podem contratar menos por talento ao contratar remotamente. Estima-se que uma força de trabalho de engenharia remota totalmente funcional economize entre US $ 11.000 e US $ 50.000 por funcionário, por ano. "O talento que trabalha em casa não exige espaço para escritório, equipamento de computação, café e cobertura de deslocações", observa um blog. Engenheiros, desenvolvedores e programadores estão entre os profissionais mais bem pagos do mundo. Mas, é tudo relativo a onde a pessoa está localizada. As taxas de câmbio tornam possível pagar bem a um trabalhador remoto sem interromper seu orçamento.

Aumentar a moral e a retenção de funcionários

A empresa de pesquisa Gartner descobriu que "até 2020, as organizações que apóiam uma cultura de 'escolha seu próprio estilo de trabalho' aumentarão as taxas de retenção de funcionários em mais de 10%". Permitir que seus funcionários determinem quando e onde eles trabalham reforça a motivação e o envolvimento com o trabalho de suas equipes. Funcionários engajados são funcionários felizes, e funcionários felizes permanecem na empresa por mais tempo.

O trabalho remoto está se tornando a norma, e não a exceção. A contratação de uma equipe remota de software prova o seu departamento de TI no futuro. “Com uma força de trabalho cada vez mais remota, você deve configurar esses sistemas agora para permanecer competitivo no futuro. Não seja a empresa que fica para trás porque você não consegue atrair o talento certo para realizar o trabalho ”, escreve um blog de desenvolvimento.

Elimine os riscos da terceirização

Algumas empresas precisam apenas de assistência de curto prazo, baseada em projetos; outros precisam de uma equipe remota em tempo integral para ajudar a cumprir a missão da empresa. Nesta segunda instância, muitas empresas tentariam usar um atalho, terceirizando seu projeto aos poucos para freelancers ou uma empresa terceirizada. Eles perdem a capacidade de controlar o projeto, nunca constroem uma equipe dedicada e gastam mais tempo e dinheiro em controle de qualidade do que se tivessem contratado uma equipe discreta e examinada de codificadores remotos. Contrate uma equipe de software remota dedicada, coordenada por uma parte, para manter “controle total sobre o fluxo de trabalho e eliminar os riscos associados à terceirização”.

Crie uma equipe de desenvolvimento de software de alto desempenho com os melhores engenheiros do mundo. Comece hoje mesmo com a Index Code.

quinta-feira, 26 de dezembro de 2019

Além do Bitcoin: como os desenvolvedores estão ajudando os bancos tradicionais a se modernizar


Este artigo foi originalmente publicado pela indexcode.io

Bitcoin e blockchain tendem a ganhar manchetes no mundo dos bancos. A criptomoeda é o filho da “tecnologia disruptiva” no setor financeiro tradicionalmente lento. Porém, há outras áreas em que desenvolvedores e engenheiros de software precisam atualizar os negócios normalmente no setor bancário para sobreviver.

Segundo uma pesquisa, 80% dos banqueiros concordaram que sua instituição "precisa concluir uma avaliação nos próximos três anos, mas apenas 15% esperavam que isso levasse a um esforço de modernização". Ameaças à segurança, demanda por banco móvel e desatualização, todos os principais sistemas bancários estão levando os bancos a considerar grandes reformas em seus sistemas de TI. Esses são os maiores desafios de modernização enfrentados pelas instituições financeiras - áreas em que desenvolvedores e equipes remotas de software podem desempenhar um papel significativo para manter os bancos competitivos.

Fazendo atualizações nas "estruturas herdadas"

Na mesma pesquisa, 60% dos banqueiros relataram que pelo menos um de seus principais desafios tecnológicos está diretamente relacionado ao envelhecimento dos principais sistemas. "A manutenção de sistemas legados representa 78% do orçamento de TI de um banco e 70% dos banqueiros sentem que seus processos principais não podem se adaptar rapidamente às mudanças", relata Ripple.

Com o tempo, os bancos resistiram a grandes mudanças em seu sistema bancário principal, o sistema de back-end responsável pelo processamento de transações, atualizações nas contas e manutenção de outros registros financeiros. Os principais sistemas bancários são responsáveis ​​pelo processamento de depósitos, empréstimos e lançamento de créditos, além de atualizar outras ferramentas de relatórios e contabilidade.

À medida que crescem os recursos direcionados ao consumidor, como depósito móvel e transferência ponto a ponto, esses sistemas bancários principais tiveram atualizações ad hoc - mas nenhuma transformação completa. Os principais sistemas de depósito foram construídos na década de 1970, escritos em "velhas e inflexíveis linguagens de programação" como Cobalt e PL/I. A análise da Oracle também descobriu que esses "sistemas principais herdados de décadas são inflexíveis e cada vez que um banco deseja lançar um novo produto deve 'codificar' o sistema, o que pode levar 12 meses ou mais".

Não existe uma solução simples para atualizar o sistema principal de um banco: é um empreendimento tecnológico maciço, mas no qual os bancos devem investir para atender bem seus clientes. Os engenheiros podem ajudar os bancos a desenvolver uma abordagem ágil e centrada no consumidor para o core banking. Existem várias abordagens para resolver o problema dos sistemas centrais arcaicos, e as equipes de software podem realizar mudanças iterativas que evoluem a infraestrutura principal de um banco sem muita interrupção do serviço.

Modernizando a proteção contra fraudes

A prevenção de fraudes continua sendo um dos desafios tecnológicos mais difíceis que os bancos enfrentam, à medida que os cibercriminosos ficam mais sofisticados para atingir os consumidores. Para ilustrar o desafio que os bancos enfrentam em manter as informações da conta do consumidor em segurança, a Kasperky Lab invadiu uma “grande empresa financeira de capital aberto em menos de 15 minutos”.

As abordagens tradicionais adotadas por muitos bancos não funcionam. Os requisitos de autenticação e os processos de verificação falham em evitar fraudes e proporcionam uma experiência negativa ao cliente. Em vez disso, escreve um especialista em segurança, “os bancos devem se concentrar na criação de melhores sistemas e técnicas para coletar e analisar dados internos e externos, desenvolver algoritmos e perfis mais significativos, executar testes de penetração em relação às estratégias atuais, detectar alterações nos padrões de transação e desenvolver soluções mais eficazes”.

Para proteger os consumidores de ataques de malware e fraude, os bancos devem passar de uma abordagem de operações reativa para uma preventiva. Os desenvolvedores podem ajudar os bancos a se preparar modernizando os sistemas que armazenam dados do usuário, movendo informações para uma nuvem criptografada. Diz-se que a ferramenta de IA da IBM, por exemplo, oferece uma análise mais rápida de ameaças e ataques persistentes avançados. Os desenvolvedores devem integrar a tecnologia mais recente nos sistemas de segurança dos bancos para se modernizar.

Abertura de conta digital

Os desenvolvedores desempenharão um papel crítico para ajudar os bancos tradicionais a acompanhar as demandas dos clientes em movimento. A abertura de conta digital é um processo em que desenvolvedores e engenheiros de software podem ter um impacto imediato.

A abertura de conta digital (DAO) é o processo de abertura de uma conta bancária sem nunca entrar no banco. O DAO envolve executar as seguintes etapas:

  • Coletar informações de identificação pessoal de um cliente
  • Avaliar e aprovar (ou rejeitar) um cliente de uma perspectiva de risco/fraude
  • Verifique a identidade do cliente
  • Aceite fundos digital e imediatamente, através de cartão de débito / crédito ou com depósito móvel
  • Sincronize com o sistema bancário principal


Muitos bancos são capazes de permitir que os clientes abram uma conta online através de um navegador da web. No entanto, a abertura de conta otimizada para celular é uma área em que o setor ficou para trás. Existem algumas boas razões para esse processo ser tão difícil. A fraude de aplicativos e leis rigorosas contra a lavagem de dinheiro dificultam o cumprimento dos requisitos regulatórios pelos bancos. Há riscos de segurança significativos : em 2018, os bancos enfrentaram mais de US$ 31 bilhões em perda de fraude global.

Mas os desenvolvedores que ajudam os bancos a se modernizar para fornecer DAO terão um impacto financeiro imediato. Um relatório constatou que 69% dos pesquisados desejam realizar todos os seus serviços bancários por meio de canais online e móveis. A BAI descobriu que cerca de 75% da geração Y e mais de 65% da geração X preferem usar um canal digital para abrir uma conta de depósito. O consumidor principal do futuro espera poder abrir uma conta, obter empréstimos pessoais e transferir fundos de qualquer dispositivo a qualquer momento. Os desenvolvedores devem encontrar uma maneira de construir a infraestrutura para permitir que os bancos ofereçam o DAO.

segunda-feira, 23 de dezembro de 2019

10 ferramentas para ajudar as equipes de desenvolvedores remotos a trabalhar com eficiência


Este artigo foi originalmente publicado pela indexcode.io

Está provado que as equipes remotas trabalham mais produtivamente do que as equipes em um ambiente de escritório. Uma pesquisa constatou que 77% dos trabalhadores eram mais produtivos ao trabalhar remotamente. Outro descobriu que 76% dos trabalhadores eram distraídos com menos frequência do que quando trabalhavam em um escritório.

Os funcionários remotos podem ser mais produtivos, mas ainda há desafios para trabalhar com eficiência em uma equipe distribuída. A coordenação de desenvolvedores em fusos horários pode apresentar uma dor de cabeça logística. As equipes de desenvolvedores remotos precisam das ferramentas e plataformas certas para garantir que possam compartilhar o trabalho com eficiência e capturar todos os benefícios do trabalho remoto produtivo. Essas são as dez melhores ferramentas para ajudar as equipes distribuídas de desenvolvedores a coordenar.

GitHub
O GitHub (e o Git) oferece um local baseado em nuvem para armazenamento, teste, compartilhamento e colaboração em projetos de desenvolvimento web. O GitHub é uma plataforma de teste para os desenvolvedores compartilharem projetos, editarem e construírem o código um do outro. Da revisão de código ao gerenciamento de projetos, às codificações e integrações sociais, o GitHub é a espinha dorsal de qualquer projeto de equipe de desenvolvedor remoto.

Slack
Toda equipe remota precisa de uma plataforma de colaboração e comunicação, e é aí que entra o Slack. Favorecido por equipes remotas de todos os tamanhos, o Slack oferece um espaço para bate-papo, para compartilhar documentos, obter feedback e coordenar projetos de codificação. Desde a solicitação de feedback do teste beta até o envio de projetos mais rapidamente, o Slack facilita uma cultura de equipe remota e um trabalho mais produtivo.

Bitbucket
O Bitbucket, anteriormente Stash, é uma ferramenta projetada para manter os desenvolvedores produtivos ao trabalhar no Git. Os repositórios Git podem ficar pesados ​​rapidamente - e o Bitbucket fornece uma maneira de estruturar repositórios com uma interface fácil e amigável. Como o GitHub, o Bitbucket oferece uma plataforma para planejar projetos, colaborando com código, testes e implantação. Além disso, configure repositórios privados ilimitados gratuitos.

Jira
Jira é uma necessidade absoluta para equipes de desenvolvimento ágil. A ferramenta de planejamento e rastreamento ajuda sua equipe a criar novas histórias de usuários, planejar sprints e atribuir tarefas para manter todos responsáveis ​​por seu trabalho. O rastreamento de erros e os relatórios são esclarecidos com o fluxo de trabalho transparente da plataforma, dando visibilidade a todos, não importa onde eles estejam no mundo. Além disso, o Jira se integra ao Confluence, Bitbucket e centenas de outras ferramentas de desenvolvedor.

Basecamp
O Basecamp é uma ótima alternativa (ou suplemento) ao Jira. A beleza do Basecamp é que ele reúne todas as ferramentas que uma equipe remota usa em um único local. A plataforma promete que um trabalhador remoto “saberá o que fazer, onde estão as coisas e onde encontrar as coisas que precisam”. O Basecamp inclui quadros de mensagens, listas de tarefas, armazenamento de arquivos, bate-papo em grupo e muito mais solução de produtividade.

InVision
Prototipar em uma equipe de desenvolvimento remoto pode ser um desafio, e é aí que o InVision vem em socorro. Este aplicativo foi usado por empresas como Airbnb, Amazon, Lyft e Netflix para colaborar em projetos de design e protótipo. Os quadros interativos e as ferramentas de design integradas à plataforma permitem feedback simplificado, coordenação inteligente e transferência eficiente entre as equipes de desenvolvimento e design. O InVision possui uma interface de usuário elegante e muitas integrações (incluindo Jira, Slack e Basecamp) para ajudar sua equipe a trabalhar da maneira mais eficiente possível.

Screenhero
Screenhero é uma ferramenta de compartilhamento de tela desenvolvida especificamente para codificadores remotos. O bate-papo por voz e vários cursores do mouse facilitam a colaboração e o emparelhamento de código ou correção de erros em conjunto. “Os designers podem iterar mais rapidamente revisando projetos com as partes interessadas ou clientes em tempo real - sem passar arquivos para frente e para trás”, escreve um revisor. Vá além do screencasting para uma maneira mais colaborativa de trabalhar virtualmente.

Google Drive
Toda equipe precisa de uma boa maneira de compartilhar arquivos. O Google Drive oferece 15 GB de armazenamento gratuito na nuvem - é uma quantidade razoável de códigos, imagens, histórias, designs e outros documentos que você pode precisar guardar para seus projetos de desenvolvimento. A flexibilidade da plataforma de armazenamento em nuvem significa que os desenvolvedores remotos podem acessar arquivos em qualquer dispositivo; os arquivos são sincronizados automaticamente e a função de salvamento automático salvou muitos planos de projeto em caso de emergência.

Every Time Zone
Às vezes, mesmo as ferramentas mais simples têm o maior impacto na capacidade de uma equipe virtual de trabalhar com eficiência. Every time zone mostra a que horas onde cada desenvolvedor está localizado. Em vez de esperar por uma resposta de um colega que está offline, um desenvolvedor pode solucionar problemas por conta própria ou seguir para uma tarefa diferente. O agendamento de reuniões e o cumprimento dos prazos se tornam mais fáceis quando você sabe quando cada pessoa está online - especialmente quando sua equipe tem agendas flexíveis. Os gerentes experientes também podem criar equipes remotas que sempre têm alguém on-line, garantindo cobertura constante sem atrasos.

I Done This
Procurando uma ferramenta simples de produtividade? I Done This é uma plataforma simples que fornece check-ins diários e relatórios de progresso para fazer mais de forma efetiva e produtiva. Acompanhe o trabalho dos seus co-desenvolvedores e acompanhe o que está sendo feito, o que está fora do cronograma e por quê. Além disso, é baseado em email, tornando-o uma adição simples às ferramentas que sua equipe já está usando.

Interessado em trabalhar com uma equipe de desenvolvedores remotos? Entre em contato com a Index Code para saber mais.

quinta-feira, 21 de março de 2019

Dynamics 365 - Update CRM via Portals

Sabemos que o Dyn365 Portals possui diversas limitações, e uma delas é a possibilidade de atualizar a base do CRM. Podemos apenas hoje usar a tecnologia Liquid para efetuar buscas no CRM.

Desta forma, segue um mecanismo para efetuar um CRUD no CRM, a partir do portal. O procedimento abaixo é um resumo do artigo criado pela UDS.

O exemplo abaixo faz uma atualização de status na tabela de apontamento.

1 - Criar a entidade PortalActions (escopo de organização), com os campos [new_action, new_parameters]
IMPORTANTE: Área de permissões do portal no Dyn365: Adicionar esta tabela no item [Permissões de Entidade], Escopo [Global], todos os privilégios, e no grid [Funções da Web], adicionar o [Administrador] e [Usuários Autenticados].

2 - Criar uma Page Template (chamada CustomActions) com o seguinte conteúdo Liquid:

{% assign action = request.params['action'] %}
{% assign parameters = request.params['parameters'] %}
{% fetchxml portalAction %}
<fetch>
 <entity name="new_portalactions">
 <attribute name="new_name" />
 <filter type="and">
 <condition attribute="new_action" operator="eq" value="{{action}}" />
 <condition attribute="new_parameters" operator="eq" value="{{parameters}}" />
 </filter>
 </entity>
</fetch>
{% endfetchxml %}

{% for item in portalAction.results.entities %}
<p>{{ item.new_name }}</p>
{% endfor %}


3 - Criar o seguinte Plugin (Message: RetrieveMultiple, EntityName: portalaction, Stage: pre)

public class ActionPlugin : IPlugin
{
    private IDictionary<string, Func<string, IOrganizationService, string>> _actionMap;

    public ActionPlugin()
    {
        _actionMap = new Dictionary<string, Func<string, IOrganizationService, string>>() {
        { "UpdateAppointmentStatus", UpdateAppointmentStatus }
     };
    }

    public void Execute(IServiceProvider serviceProvider)
    {
        var context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
        var serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
        var service = serviceFactory.CreateOrganizationService(null);

        FetchExpression currentQuery = context.InputParameters["Query"] as FetchExpression;
        if (currentQuery != null) {
            XDocument parsedQuery = XDocument.Parse(currentQuery.Query);

            var requestParameters = parsedQuery.Descendants("filter").Elements().ToDictionary(e => e.Attribute("attribute").Value, e => e.Attribute("value").Value);

            if (requestParameters.ContainsKey("new_action") &&
            requestParameters.ContainsKey("new_parameters") &&
            _actionMap.ContainsKey(requestParameters["new_action"])) {
                string parameters = Encoding.UTF8.GetString(Convert.FromBase64String(requestParameters["new_parameters"]));
    parameters = parameters.Replace("\"", "");

                string result = _actionMap[requestParameters["new_action"]](parameters, service);
                var restulCollection = new EntityCollection();

    Guid id = Guid.NewGuid();
    restulCollection.Entities.Add(
    new Entity("new_portalactions") {
     Id = id,
     Attributes =
     {
      { "new_portalactionsid", id },
      { "new_result", result }
     }
    });
    
            }
        }
    }

    private string UpdateAppointmentStatus(string id, IOrganizationService service)
    {

        try {
            var _state = new SetStateRequest();
            _state.State = new OptionSetValue(1);
            _state.Status = new OptionSetValue(2);
            _state.EntityMoniker = new EntityReference("ENTITY_NAME", Guid.Parse(id));
            var stateSet = (SetStateResponse)crmService.Execute(_state);
        }
        catch (Exception ex) {
            return "Error: " + ex.Message;
        }

        return "Success";
    }
}

4 - Criar a classe JS [CrmActionHelper] e EXECUTÁ-LA em uma Portal Page (ONLOAD da página)

CrmActionHelper = CrmActionHelper || { __namespace: true };
(function (CrmActionHelperNamespace) {
 CrmActionHelperNamespace.Action = function (action, parameters) {
 var request;
 var url = "/CustomActions?action=" + action + "&parameters=" + prepareParameters(parameters);

 var $result = $.ajax({
 type: "GET",
 dataType : "json",
 url: url,
 beforeSend: function(xhr) {
 request = xhr;
 },
 error: function (jqXHR, textStatus, errorThrown) {
}

 });
 
 return { deferred: $result, request: request };
 }
 
 function prepareParameters(parameters) {
 return btoa(JSON.stringify(parameters));
 }
})(CrmActionHelper);
 
CrmActionHelper
 .Action("UpdateAppointmentStatus", "ID DO APONTAMENTO")
 .deferred
 .done (function (result) {
 });
 


That's it!