No meu lugar

ChefinhoQuero contar um pouco a minha experiência e mostrar como hoje penso em alguns aspectos.

Fui aluno. Estou falando de curso superior. Era aluno que não dava muita importância, assim como a maioria dos alunos, principalmente na capacidade de vários professores que, certamente, poderia ter tirado muito proveito das explicações e até no networking.

Após alguns anos passei para o outro lado da força e virei professor. E ironia ou não, no mesmo centro universitário onde me formei.

Olhava os alunos dentro a sala e me vinha dois sentimentos: a) Me sentia com vergonha do que tinha feito algumas vezes como aluno; e b) Sentia que tinha perdido muito tempo como aluno, podendo ter aproveitado muito mais.

Vendo aqueles alunos perdendo tempo, assim como eu perdi,  tentava de todas as formas fazer, com dinâmicas de sala de aula e falando para eles sobre minhas experiências, fazer com que eles não passassem pelas mesmas más experiências,  mas a maioria não percebia. Talvez eles devessem também passarem a ser professores naquele momento. Mas tem aquele velho ditado para aproveitar o momento. Não é?

Antes mesmo de começar a lecionar eu trabalhava como programador, passando pelo estágio que consegui no meio do curso e antes não trabalha com informática. Fui galgando com vagareza, com cuidado para não dar o passo maior que a perna.

O irônico é que após o meu estágio, após ser “promovido” para programador júnior, presenciei a entrada de outros estagiários, e alguns deles, pareciam não entender que aquele momento era de aprendizado, mas fazer o que… É aquele lance da visão.

Atualmente,  tenho uma responsabilidade aqui na Qualidata de líder de equipe, e com o passar do tempo comecei a ter algumas percepções nas pessoas e naquilo que eu gostaria que fosse o ideal para mim e para o processo de trabalho. E acho que é assim que os donos, empregadores, como desejam chamar, podem estar nos observando também.

Muitas vezes quando estava no desenvolvimento exercendo uma função subordinada, eu até percebia, mas muitas vezes não fazia aquilo que era percebido por mim. Não sei se por medo de querer passar por cima do “chefe”, ou se era mesmo negligência.

O fato é que queria falar de alguns detalhes que tenho tomado como parâmetro para entender as pessoas desse mercado de trabalho tão competitivo.

Confiabilidade: Muitas vezes o a pessoa a quem a atividade é atribuída diz que consegue fazer, no final das contas não faz e depois dá uma desculpa. Por não ter conseguido. Acredito piamente, que se pessoa que aceita uma incumbência ela deve ter consciência, certeza de que poderá ser difícil, mas que será possível.

Não tente uma carreira solo: Será possível dar conta das atividades. Como? Peça e ofereça ajuda. Tentar fazer carreira solo num ambiente corporativo, não vai funcionar. Nesses ambientes, todos dependem de todos.

Observe: Tente rapidamente entender como a empresa que você está funciona. Talvez seu perfil era ótimo na empresa anterior, mas na atual, se você não se adaptar, está fadado a cair.

Praxe: É sempre bom falar. Ser criativo, tentar ir além do óbvio, mas,  o mais importante que isso mostrar que sabe fazer o óbvio. Ir além, deve ser com cautela, dando passo após passo, ajuda muito e evita tropeções.

Atualizar-se: Precisa falar mais? Mas vou falar, fazer cursos, ler bastante e trocar muitas ideias com pessoas mais experientes.

Errar. Mas reconhecer o erro. Errar faz parte da vida, e pode, se for bem absorvido, nos trazer muitos aprendizados. Tem que arriscar. Quem não arrisca fica estacionado. E quem por ventura está escondendo os erros, prepare-se, um dia vai ser apanhado de surpresa. “Oi!”

Tente ser bem humorado. O tempo passa mais rápido e muitos problemas podem ser resolvidos mais facilmente.

Estou tendo bons resultados comigo mesmo e espero que esteja tendo resultados bons com as pessoas com quem trabalho, que é o mais importante para quem está com uma atribuição de liderar.

Postado em 20 de setembro de 2012 por Fabio Colli | Sem Comentários »

O Garbage Collector .NET não elimina a preocupação com memória

Não sei se isso aconteceu com você, mas eu que vim do C/C++ para C#.Net estranhei muito essa coisa de não se preocupar com liberação de memória. Todos os exemplos C# que via simplesmente alocavam o objeto, o guardavam numa variável local qualquer (na pilha), e depois deixavam a variável local ser liberada. E o objeto que ficou no heap? Bom, o Garbage Collector, nosso “big brother”, vai cuidar da gente e não vai deixar nenhum problema acontecer.

Mas a verdade é um pouco diferente. O ambiente gerenciado e o GC (Garbage Collector) nos ajudam muito realmente, mas não podemos simplesmente esquecer da finalização dos objetos.

Há muitas considerações sobre boas práticas para gerência de memória em .NET. Veja por exemplo as dicas dadas nesse artigo: http://msdn.microsoft.com/en-us/library/ms973837.aspx. Mas para manter esse artigo mais enxuto, vou focar na questão fa finalização dos objetos. E para isso, vou pular boa parte do embasamento teórico e dos porquês, e ir o mais rapidamente possível ao como fazer.
Primeiramente precisamos entender que há dois tipos de recursos: os gerenciados (objetos .NET) e os não gerenciados (recursos externos, como arquivos abertos, conexão com bancos de dados, etc.). A primeira ideia de alguém que vem do C/C++ é implementar um finalizador, um método do tipo ~Classe(), que libera todos os recursos. Um dos problemas dessa estratégia é o não determinismo, pois você não tem como saber em que momento o GC vai realmente coletar e finalizar esse objeto. E é bom lembrar que o custo do GC coletar memória é alto, e sua estratégia é adiar isso o máximo possível.

Por exemplo, se você escolher implementar uma certa rotina de banco de dados em uma classe .NET, e resolver fechar a conexão no finalizador da classe, a rotina será concluída, a variável que aponta para o objeto liberada, mas ainda assim o objeto estará “vivo”, aguardando um GC chamar seu finalizador e liberá-lo, e isso irá manter a conexão com o banco aberta por um tempo possivelmente enorme.

Ou seja, no que diz respeito a recursos gerenciados que precisam ser liberados, precisamos seguir outra estratégia, algo que nos dê garantia do momento da finalização do objeto.

Outro preocupação é o tratamento de objetos gerenciados. Na verdade nós não conseguimos liberar memória deles explicitamente. Isso sempre será responsabilidade do nosso Big Brother, o GC, que fará isso na hora que ele quiser. Mas nós devemos nos preocupar, dentre outras coisas, em finalizar os objetos gerenciados de forma adequada, especialmente objetos com tempo vida maior (para mais detalhes, estude a estratégia do GC em separar os objetos em gerações) e com muitos ponteiros. Uma das coisas que o GC precisa fazer quando vai fazer uma coleta, é verificar quais ponteiros sofreram alguma alteração e varrer todos os objetos, partindo dos “roots” (variáveis locais de um procedimento, por exemplo), para identificar quais objetos não estão mais sendo referenciados e são candidatos a liberação. Na verdade toda vez que você faz objeto1.propriedade = objeto2 o “write barrier code” do GC é executado para controlar isso. Como um “full collection” é muito custoso para ser feito o tempo todo, o GC tem toda uma heurística para separar os objetos em gerações e diminuir esse esforço, mas detalhar isso aqui vai complicar muito o artigo.

Sendo mais pragmático, o que estou tentando dizer é que apesar de não liberarmos explicitamente um objeto gerenciado, ajudaria muito ter uma finalização explícita não só para liberar recursos externos (não gerenciados), mas também para atribuir null a todos os ponteiros do objeto. Fazendo isso o GC terá apenas um monte de objetos soltos, ao invés de uma complexa malha de objetos relacionados para inspecionar.

Se você se aprofundar nas boas práticas recomendadas para otimizar o trabalho do GC, vai ver muito mais coisas. Mas minha intenção nesse artigo é propor algo simples, que já vai ajudar muito a grande maioria dos desenvolvedores que desconhecem ou optaram por ignorar essas coisas, dada sua complexidade.

A recomendação da Microsoft para controlar explicitamente a finalização dos objetos é a implementação do padrão de projeto Disposable, implementando apropriadamente a interface IDisposable. Dessa forma, quando quiser liberar um objeto, basta chamar objeto.Dispose() .Embora não seja obrigatório, também recomendo fazer objeto = null.

O exemplo abaixo mostra como implementar o pattern de forma adequada. Os comentários no código exemplo explicam o porquê de cada coisa.

// Classe exemplo que implementa IDisposable
    public class ClasseExemplo : IDisposable
    {
        //Apenas para exemplificar
        private SqlConnection sqlConnection;

        //Construtor da classe.
        public ClasseExemplo()
        {
            //Inicializações de objetos gerenciados
            sqlConnection = new SqlConnection();

            //Inicializações de recursos não gerenciados como arquivos, 
            //conexoes, referências externas (IntPtr), etc.
        }

        #region Pattern Disposable

        //Protege o programa de NullReference no caso de 
        //chamarem Dispose() mais de uma vez.
        private bool finalizado = false;

        // Implementação de IDisposable. 
        // Esse método nao deve ser virtual pois uma classe derivada
        // não deve poder sobreescreve-lo.
        public void Dispose()
        {
            //Chama o metodo finalizar que irá liberar os recursos, 
            //indicando que ele está sendo chamado do Dispose().
            Finalizar(disposing: true);

            // Objetos com finalizadores, ou seja, ~Classe(),
            // impõem um custo adicional ao GC na coleta.
            // Além disso, se já chamaos Dispose(), todos os
            // recursos já foram liberados, e não precisaríamos
            // chamar seu finalizador.
            // Esse método diz para o GC ignorar a finalização
            // desse objeto, pois ele já foi finalizado manualmente.
            GC.SuppressFinalize(this);
        }

        //Finalizar(bool disposing) é executado em dois cenários
        //distintos. Quando chamado via Dispose(), que por sua vez
        //foi chamado direta ou indiretamente (via "using ..."
        //por exemplo) pelo código do desenvolvedor. Ou quando chamado
        //pelo finalizador ~Classe(), que por sua vez foi chamado
        //pelo GC no momento da coleta. E isso só acontece se
        //O Dispose() não foi chamado, por causa
        //do GC.SuppressFinalize(this).
        //A questão central aqui é que se ele for chamado pelo GC,
        //não há como garantir o estado dos outros objetos gerenciados
        //que porventura sejam referenciados por ele, pois o GC
        //já pode ter liberado eles, e tentar referencia-los para
        //chamar objeto.Dispose() pode ser desastroso. Logo, no
        //caso de Finalizar() ter sido chamado pelo GC, queremos
        //apenas liberar recursos NÃO GERENCIADOS, para que eles não
        //fiquem bloqueados. Mas não devemos nos envolver com recursos
        //gerenciados nesse momento.
        private void Finalizar(bool disposing)
        {
            // Evita que Finalizar() seja chamado mais de uma vez
            if (!this.finalizado)
            {
                //Se foi chamado por Dispose(),
                //libera os recursos gerenciados
                if (disposing)
                {
                    // Libera recursos gerenciados.
                    sqlConnection.Dispose();
                    sqlConnection = null;
                }

                // Qualquer que seja o caso,
                // libere aqui recursos não gerenciados,
                // quando houver.

                //Exemplo:
                //CloseHandle(handle);
                //handle = IntPtr.Zero;
            }
            finalizado = true;
        }

        // Implementa o destrutor C# para finalização da classe.
        // Contudo esse finalizador só será chamado se o método Dispose
        // do Pattern Disposable não for chamado pelo código do usuário.
        ~ClasseExemplo()
        {
            //Chama o metodo finalizar que irá liberar os recursos, 
            //indicando que ele NÃO está sendo chamado do Dispose(), 
            //ou seja, está sendo chamado do ~Classe().
            Finalizar(disposing: false);
        }

        #endregion

    }

As duas formas mais comuns de usar com segurança um objeto que implemente o pattern Disposable e finalizá-lo no final é:

var objeto = new ClasseExemplo();

            try
            {

                //faz algo
            }
            finally
            {
                objeto.Dispose();
            }

Ou utilizar o recurso sintático semanticamente equivalente do “using”:

            using (var objeto = new ClasseExemplo())
            {
                //faz algo
            }

Especialmente em aplicações com um tempo de vida longo (que ficam em execução por um tempo indeterminado), mais cedo ou mais tarde o limite de memória vai ser atingido e o GC vai precisar entrar em ação. E se as coisas não estiverem bem feitas, podemos enfrentar sérios problemas de performance e até de memória indisponível. Como disse antes, existem outras dicas importantes, mas fogem ao escopo desse artigo.

Espero ter ajudado. O GC é muito bom, mas não faz tudo de forma mágica e instantânea. Nós precisamos fazer a nossa parte para desenvolvermos aplicações robustas!

Postado em 14 de setembro de 2012 por Fabrício Vargas Matos | Sem Comentários »

Consultando o Log de Erro do SQL Server usando T-SQL

A leitura diária dos arquivos de log do SQL Server é uma das tarefas primárias do DBA. Particularmente tenho o hábito de visualizar o log corrente a cada 10 minutos (no máximo), pois, a leitura do log faz parte da minha estratégia de monitoração. Nesse sentido, tenho preferido consultar os log usando T-SQL ao invés da interface gráfica (Log File Viewer). Dentre os principais motivos para utilizar T-SQL ao invés da interface gráfica destaco:

  • A visualização fica mais fácil e o conteúdo do arquivo é carregado mais rapidamente (tente abrir um arquivo de log de erro muito grande usando o Log File Viewer e você sentirá uma certa demora);
  • Usando T-SQL é possível fazer pesquisas customizadas sobre o log do mesmo modo como fazemos na interface gráfica, contudo, a pesquisa com T-SQL é mais rápida;
  • E, a principal vantagem no meu ponto de vista, é que via T-SQL podemos ler o log de erro de vários servidores ao mesmo tempo, executando um único comando.

Para fazermos a leitura via T-SQL podemos utilizar as seguintes SP’s:

  • Sp_readerrorlog
  • Xp_readerrorlog

Os Arquivos de Log

Os logs de erro do SQL Server são salvo em arquivos, por padrão na subpasta “Log” da unidade de disco onde a instância foi instalada. É possível abrir e visualizar o conteúdo desses arquivos utilizando um editor de texto como o Notepad.

Toda vez que a instância é reiniciada, o arquivo corrente é arquivado e renomeado sob o nome ERRORLOG.1, enquanto um novo arquivo de log é criado com o nome ERRORLOG. Por default, o SQL Server mantém até 6 arquivos de log arquivados. Caso queira aumentar esse limite, estando no SQL Server Management Studio, faça conforme ilustrado nas figuras abaixo:

1

2

O arquivo de log corrente tem índice 0 e essa informação é importante para a utilização das SP’s de leitura do log de erro que falaremos mais adiante.

É possível listar via T-SQL os arquivos de log de erro da instância. Veja como:

exec sp_enumerrorlogs

3

Veja que a stored procedure listou os arquivos de log de erro, neste caso, os 6 logs arquivados e o log corrente (de índice 0). Também mostrou a data e hora da última entrada no log (último registro) e o tamanho em disco do arquivo.

Usando SP_READERRORLOG / XP_READERRORLOG

Em termos de sintaxe e de benefícios ambas SP’s são idênticas. Contudo, é válido destacar que a XP_READERRORLOG é uma procedure estendida, além de não documentada.

Para visualizar o log de erros atual do SQL Server simplesmente execute:
exec sp_readerrorlog
4

Essa stored procedure tem os seguintes parâmetros opcionais:

Parâmetro Valores Descrição
P1 0,1,2,4,5,6… Indica o número do arquivo de log a ser lido. O default é 0.
P2 1 ou 2 Indica o tipo de log a ser lido, onde: 1 = sql server; 2 = sql agent. O default é 1, ou seja, o log do sql server
P3 Texto entre aspas simples ou aspas duplas a ser localizado dentro do log (coluna Text). ATENÇÃO: quando usar a XP_READERRORLOG o texto deve estar entre aspas duplas. A pesquisa é parcial, procurando em qualquer parte da palavra. Deixe NULL neste parâmetro para não utilizá-lo ou simplesmente basta omiti-lo.
P4 Trata-se de uma segunda string a ser pesquisada, objetivando refinar a consulta. Na verdade este parâmetro produz a combinação P3 + P4, ou seja, as duas palavras pesquisadas devem existir na mesma entrada (linha) do log. Deixe NULL neste parâmetro para não utilizá-lo ou simplesmente basta omiti-lo.

Vejamos alguns exemplos.

Localizar as entradas que contenham a palavra AdventureWorks no log corrente do SQL Server.

exec sp_readerrorlog 0, 1, 'adventureworks'

5

Localizar as entradas que contenham as palavras CHECKDB e AdventureWorks no log corrente do SQL Server.

exec sp_readerrorlog 0, 1, 'checkdb', 'adventureworks'
6

Esse tipo de consulta no log é muito útil quando queremos pesquisar por erros ou, por exemplo, filtrar as entradas referentes a backup, etc.

Criando um script para consultas mais refinadas

Como comentei no início do post, tenho o hábito de ficar lendo o log em intervalos de no máximo 10 minutos. Desta forma, não tenho a necessidade de listar o log por completo, apenas as informações dos últimos 10 minutos e, caso se faça necessário, ir ampliando esse range. Fazer esse tipo de pesquisa usando a SP_READERRORLOG ou XP_REAERRORLOG não é possível. Por conta disso, estou deixando o script de uma stored procedure “personalizada”, que possibilita a realização de consultas bem flexíveis. Recomendo criar essa SP na database Master ou em um banco de dados criado para fins administrativos. Caso prefira, você pode baixar o script com o código fonte da SP aqui.

USE Master
GO
 
IF OBJECT_ID('dbo.uspErrorLog') IS NOT NULL
	DROP PROCEDURE dbo.uspErrorLog;
GO
 
CREATE PROCEDURE dbo.uspErrorLog
(
	-- Quantidade de minutos a retroagir na pesquisa.
	-- O Default são 30 minutos
	-- Informe NULL para desconsiderar e não usar este parâmetro
	@MinutosRetroagir INT = 30,
 
	-- Data inicial para a pesquisa no log.
	-- Registros com datas menores serão desconsiderados
	-- O Default é NULL
	-- Informe NULL para desconsiderar e não usar este parâmetro
	@DataInicial DATETIME = NULL, 
 
	-- Data final para a pesquisa no log.
	-- Registros com datas maiores serão desconsiderados
	-- O Default é NULL
	-- Informe NULL para desconsiderar e não usar este parâmetro
	@DataFinal DATETIME = NULL, 
 
	-- Texto a ser pesquisado dentro da coluna ProcessInfo do log
	-- Exemplo: Server, Backup, SPID, etc.
	-- A pesquisa pelo texto é parcial (em qualquer parte)
	-- O Default é NULL
	-- Informe NULL para desconsiderar e não usar este parâmetro
	@Processo VARCHAR(50) = NULL,
 
	-- Texto a ser pesquisado dentro da coluna Text do log
	-- Exemplo: error, starting, etc.
	-- A pesquisa pelo texto é parcial (em qualquer parte)
	-- O Default é NULL
	-- Informe NULL para desconsiderar e não usar este parâmetro
	@Texto VARCHAR(100) = NULL,
 
	-- Filtra a pesquisa para exibir apenas o log do nome do servidor informado
	-- Use este parâmetro quando estiver pesquisando o log de vários servidores ao mesmo tempo
	-- O Default é NULL
	-- Informe NULL para desconsiderar e não usar este parâmetro
	@NomeServidor VARCHAR(128) = NULL
)
AS	
 
	DECLARE @Tmp TABLE
	(	ID INT IDENTITY,
		Data DATETIME,
		Processo VARCHAR(50),
		Texto VARCHAR(4000)
	);
	INSERT INTO @Tmp (Data, Processo, Texto) exec sp_readerrorlog;
 
	SELECT * FROM @Tmp t
	WHERE t.Data >=
		CASE WHEN @MinutosRetroagir IS NOT NULL THEN DATEADD(MINUTE, -@MinutosRetroagir, GETDATE())
		ELSE t.Data END
 
	AND t.Data >= ISNULL(@DataInicial, t.Data)
 
	AND t.Data <= ISNULL(@DataFinal, t.Data)
 
	AND t.Processo LIKE
		CASE WHEN @Processo IS NOT NULL THEN '%' + @Processo + '%'
		ELSE t.Processo END
 
	AND t.Texto LIKE
		CASE WHEN @Texto IS NOT NULL THEN '%' + @Texto + '%'
		ELSE t.Texto END
 
	AND SERVERPROPERTY('ServerName') =
		ISNULL(@NomeServidor, CONVERT(VARCHAR(128), SERVERPROPERTY('ServerName')))
 
	ORDER BY t.ID DESC;
 
GO

Reciclando o log de erro

Como já foi mencionado, o log de erro é reciclado (reiniciado) automaticamente toda vez que a instância sofre um restart. Considerando que um servidor de banco não é resetado com frequência – normalmente permanece vários meses online, a tendência é o log ficar demasiado grande, dificultando a análise e leitura. Assim, quero deixar uma sugestão: recicle manualmente, de tempos em tempos, o log de erro do SQL Server. Particularmente, faço essa reciclagem a cada 7 dias – normalmente crio um job que é executado aos domingos. Contudo, essa frequência de reciclagem varia de ambiente para ambiente, além de preferências e políticas.

O comando para reciclar manualmente o log de erros é o seguinte:

DBCC ERRORLOG

Conclusão

Inclua em sua estratégia diária de monitoramento a leitura dos log’s de erro do SQL Server. Em ambientes com várias instâncias essa tarefa pode ser facilitada, e muito, através do T-SQL, permitindo analisar o log de várias instâncias ao mesmo.

Até o próximo post!

Postado em 6 de agosto de 2012 por Adeilson Brito | Sem Comentários »

O solucionador de problemas e a arte de pedir socorro

Era uma vez uma empresa . Era uma vez um funcionário. Era uma vez um herói. Seu nome era Asdrorbaldo. Asdrôr para os íntimos.

Pontualíssimo, todos os dias Asdrôr chegava para trabalhar com a disposição de um guerreiro, a motivação de um bárbaro Viking, a energia de um reator nuclear e a alegria que o palhaço mais animado que você já conheceu não teria – ok, palhaços de filmes de terror, felizes ao fazer mais uma vítima, aqui não contam. ;-)

Como um ninja, resolvia seus afazeres em segredo, silenciosamente, de forma que ninguém diria que estava lá. Mas ele estava. Aliás, sempre esteve.

Seu super poder consistia num imã interno que, por natureza, atraia coisas mais úteis do que ferro ou qualquer coisa suscetível à ação de imãs: problemas a serem resolvidos (afinal, qual seria a importância do ferro se não fossem os problemas que a sua existência resolve?).

Feliz como um cachorrinho quando o dono chega em casa, Asdrôr de pronto começava a resolver todos os problemas que surgiam à sua frente, e sentia-se assim um funcionário importante para a empresa. Talvez até O funcionário mais importante da empresa. Até um dia, em que, de susto, fora chamado à sala de seu superior: este havia detectado sua fraqueza.

A fraqueza de Asdrôr não era assim tão importante para ele, e ele de fato nem mesmo a conhecia, mas era real e o importante é que não o atingia diretamente, mas à empresa em que trabalhava. A fraqueza de Asdrôr, acredite, era não saber pedir por socorro.

Acontece que, ao resolver uma tarefa, Asdrôr empenhava-se demais nela, mergulhava no problema de corpo e alma como um fã de ficção mergulha no novo universo que lhe é apresentado. Ele não descansava enquanto não resolvesse a malfadada missão: se não soubesse de pronto como resolvê-la trocava informações secretas e codificadas unicamente com seu amigo Oráculo (apelido que dera ao Google.com), e gastava toda a energia que sua super caneca de café matinal lhe concedera ao acessar os links retornados.

Só que a prática do Asdrôr, adicionada às inúmeras tentativas (e erros) que ele executava, fazia com que às vezes ele gastasse muito tempo na busca por resolver o problema sozinho. E ele não conseguia perceber que isto gerava insatisfação para o cliente, além de aumento de custo para a empresa para a qual trabalhava.

Ora, para o cliente de sua empresa, que gerava as demandas atendidas por ele, não importava QUEM resolvesse seus problemas, e nem mesmo COMO o problema fosse resolvido. Ele só queria que fosse no menor tempo possível.

Por sua vez, a empresa queria que ele resolvesse mais questões em menos tempo porque, desta forma, ela poderia aumentar o número de clientes e promover mais ganhos para ela mesma e para seus funcionários.

A partir daquele momento Asdrôr passou a rever seus conceitos e habilidades. A conversa que tivera com seu superior nem de longe visava assustá-lo e, por isso, foi conduzida na base de conselhos, que conforme souberam depois estão elencados a seguir:

  1. Lembre-se que você não vive só – socializar é uma das maiores habilidades do ser humano, e porque não socializar sobre assuntos profissionais e dificuldades?
  2. Nossa sociedade contemporânea é conhecida como a ‘Sociedade da Informação’ também porque é fácil hoje em dia compartilhar o que sabemos, mas é necessário que você compartilhe primeiro o quê quer saber – você não precisa mais recorrer a uma enciclopédia cara e desengonçada para ter suas dúvidas resolvidas, pode ir na internet, mas lembre-se que as questões só estão hoje registradas na internet porquê alguém um dia perguntou ‘Por quê?’, ‘Como?’, ‘Onde?’ ou ‘Quem?’, então não tenha medo de perguntar. E lembre-se que seu colega ao lado pode ter todo o conhecimento já filtrado para você.
  3. Não se considere a primeira bolacha do pacote... – Você pode ter pego uma questão totalmente nova, com um problema e dificuldade absurdos… para você. Pode ser que alguém já tenha passado por isso antes e já tenha a solução pré-definida ou possa te indicar a direção.
  4. …Tampouco se considere a última bolacha do pacote – Não se sinta mal por pedir ajuda. Todo mundo já pediu ajuda um dia, e com certeza você não será o último.
  5. Alguém pode te dar a visão além do alcance, para que você veja o que está a 5cm de você – Muitas vezes a resposta para um problema está bem na nossa frente, mas estamos muito dentro do problema para percebê-la. E quanto mais esforço você fizer para resolver a questão sozinho, mas difícil ficará para fazê-lo. Abra o problema para alguém e peça uma segunda opinião. Pode até ser que você mesmo, ao explicar para o colega a questão e tentativas, já enxergará a solução, mas ela não apareceria se você não tivesse feito isso.
  6. Entenda que há PROBLEMAS e problemas – você pode ter um produto enorme e um cem vezes menor para gerir. Só que este último pode ser o mais problemático dos dois e requererá que você peça ajuda muito antes, sem prazo para tentativas em vão.
  7. Uma grande virtude de um herói é ter medo apenas na medida certa para fazer as coisas com prudência e não piorar o que já ocorreu – Uma vez que qualquer pessoa teve, tem ou terá dúvidas, um pedido de ajuda de um colega de trabalho é sempre bem recebido. Da mesma forma, se a dúvida extrapola o seu nível de conhecimento ou responsabilidade, deverá ser com toda a honra que seu chefe/líder te ajudará, já que um chefe/líder de verdade sempre ajuda sua equipe para que juntos alcancem o sucesso no que estiverem fazendo. Vai lá, Abre a boca! Sem medo!

Ao final seu chefe explanou ainda que ‘Pedir Socorro’ era uma arte, em sua visão, pois que poucas são as pessoas que realmente sabem a hora e a forma de fazer o clamor. Se demorasse muito o problema poderia já ter aumentado de tamanho e, se a pessoa fosse afoita, ao fazê-lo um dia seu pedido poderia não ser levado a sério. Se viesse com muita arrogância no pedido seu ajudante poderia não ajuda-lo com bom humor e qualidade, mas se viesse com excesso de humildade sua ajuda poderia entrar na lista de tarefas pendentes do ajudante e este talvez só se propusesse a executar a ajuda ao final do dia de trabalho, depois que já tivesse feito todas as coisas.

E daquele dia em diante Asdrôr, Asdrôrzinho para você, já que agora você já está mais que íntimo, trabalhou bem melhor, e ainda foi melhor visto pela empresa, pois saiu da Liga do Eu Comigo e entrou para a Força dos Colegas de Trabalho Superpoderosos.

Postado em 30 de julho de 2012 por Leonardo Moulin Franco | 1 Comentário »

Mais Valor com Menos Dinheiro

Palavra do CEO.

Na última reunião do comitê estratégico da Qualidata, formado pela diretoria e alguns colaboradores, definimos uma ação muito interessante que gostaria de compartilhar aqui. Em geral os números de nossa pesquisa de satisfação de colaboradores são muito bons. Contudo alguns poucos itens sempre tinham uma avaliação razoável, e um deles dizia respeito ao valor do ticket refeição. Apesar de trabalharmos dentro dos padrões definidos pelo sindicato, os colaboradores entendiam que os valores deveriam ser um pouco maiores, em especial por conta do custo de refeição na região, e isso ficava claro na pesquisa de satisfação e nas conversas que tínhamos.

Na reunião do comitê estratégico discutimos um bom tempo sobre qual percentual de aumento seria ao mesmo tempo viável para a empresa e suficientemente expressivo para gerar uma percepção de melhora significativa para os colaboradores. Também discutimos até que ponto essa melhoria seria percebida de forma duradoura.

Após boa discussão propus uma alternativa inusitada. Ao invés de darmos um aumento no valor do ticket, que já estava dentro dos patamares legais, por que não darmos outro tipo de benefício que seja muito mais do que financeiro? Porque não dar algo que alivie um pouco o bolso do colaborador, mas também gere integração na equipe e ajude a construir um ambiente de trabalho mais agradável?

Minha proposta foi simples. Ao invés de darmos um aumento, iríamos patrocinar um almoço de confraternização toda sexta-feira. Desta forma não só proporcionaríamos uma economia de 20% nos gastos com refeição, como também teríamos toda semana uma boa oportunidade de estarmos juntos, num almoço fraternal, o que gera muitos outros benefícios para uma empresa que acredita nas pessoas.

almoco

Iniciamos isso há duas semanas, e o retorno dos colaboradores tem sido muito positivo. Falamos muito de inovação aqui na Qualidata e de avaliar o que agrega mais valor para o cliente no contexto de produtos de software, mas às vezes pequenas inovações como essa permitem que os investimentos sejam feitos de forma muito mais inteligente, gerando com o mesmo dinheiro muito mais valor para a empresa .

Fabrício Vargas Matos
Diretor Executivo

Postado em 26 de julho de 2012 por Fabrício Vargas Matos | 1 Comentário »

Tags

Oportunidade

Tópicos recentes

Fique Antenado

Copyright © 2013 Blog da QUALIDATA.

Wordpress themes