Thursday, April 21, 2011

Só para quem pensa que sabe C ou C++

Considere-se a expressão (***********printf)(&0["olá mundo!"]);
Isto é legal em C ou C++? Se sim, o que faz?


Notas iniciais:
  1. O operador * (deferenciar um ponteiro) é associativo à direita, ou seja: **a é o mesmo que *(*a);
  2. Uma função quando não está em contexto de ser invocada (ou seja, não tem parenteses à frente) converte-se num ponteiro para a função, ou seja: f é o mesmo que &f;
  3. Uma string constante ("entre aspas") é implementada como um array;
  4. O 'valor' de uma string constante é o endereço do seu primeiro elemento;
  5. O primeiro elemento de qualquer array em C é o de ordem 0 (zero);
  6. A prioridade do operador [] (indexação de array) é superior à prioridade do operador & (obtenção de endereço), ou seja: &a[b] é o mesmo que &(a[b])
  7. O operador [] (indexação de array) é comutativo, ou seja: a[b] é a mesma coisa que b[a]. A razão deste facto é que por definição a[b] é o mesmo que *(a+b), como a soma é comutativa é o mesmo que *(b+a) o que é o mesmo que b[a];
1ª parte: (***********printf)

Por 2) printf é o mesmo que &printf.
Logo, e tendo em atenção 1), *&printf é o mesmo que printf.
Por recursão conclui-se que (***********printf) é o mesmo que printf.

2ª parte: &0["olá mundo!"]

Aplicando 6) fica: &(0["olá mundo!"]).
Pela comutatividade 7) fica: &("olá mundo!"[0])
Tendo em conta 3), "olá mundo!"[0] é o primeiro caracter da string.
Logo aplicando & obtemos o endereço do 1º caracter.
Mas por 4) isso é o mesmo que ter a string "olá mundo!"

Conclusão:

O código inicial é o mesmo que printf("olá mundo");

Monday, April 18, 2011

Build process from hell

Ano de 2004. Um software que estava a ser desenvolvido por uma empresa austríaca e que foi transferido para a minha equipa.
Não usavam source control. Havia registo de bugs (cerca de 500 bugs abertos).
2 milhões de loc, 50 MB de sources e cerca de 6000 ficheiros em Visual C++ 6.0.
1 exe e 52 DLLs, portanto 53 projects dentro do Visual C++. Carradas de dependências entre módulos mas nenhuma indicada no Visual C++.
Como era feito o build process?
Com base nos ficheiros alterados adivinhava-se quais os targets a fazer build.
No caso de erro em alguns dos builds, tinha de se tentar por outra ordem.
No caso de várias tentativas (com várias ordenações) falharem era preciso mudar os settings e forçar o build. Normalmente eram várias DLLs que tinham dependências circulares. Ou seja: A dependia de B; B dependia de C; e C dependia de A. A solução era forçar a criação de A (ignorando erros), depois fazer build a B e a C, depois apagar A e fazer-lhe build novamente (desta vez sem forçar).
Um pesadelo completo! Digamos que com sorte conseguia-se compilar num dia(!) de trabalho.

Depois de um mês de trabalho a identificar todas as dependências e a automatizar o processo de build conseguimos colocar o processo de build fully automatic.
Ficou só a demorar 4h a compilar tudo...

Saturday, April 16, 2011

Como transformar o seu carro num verdadeiro veículo de competição

  • Tambores dos travões de trás pintados de vermelho
  • Lenços nos encostos de cabeça de preferência com a bandeira nacional made in China
  • Coletes fluorescentes nas costas dos bancos
  • Autocolante "Turbo"
  • Autocolante "Penelope"
  • Autocolante "Tuning não é crime"
  • CD pendurado no espelho retrovisor
  • Fita de casamento na antena suja de pelo menos 3 meses
  • Caixa de lenços de papel marca Continente no tablier
  • Ponteira de escape dupla Devil (interior vermelho)
  • Águia no capot
  • Aileron traseiro tipo tábua de passar a ferro
  • Película autocolante escura nos vidros (de preferência com bolhas de ar)
  • Cão Abana-Abana no tabuleiro traseiro
  • Cachecol de Portugal no cimo do pára-brisas
  • Autocolante racing na tampa do depósito de combustível a imitar fibra de carbono com parafusos falsos
  • Faróis de nevoeiro (desalinhados)
  • 3 (mínimo) pirilampos mágicos no tablier
  • Placa no tablier a dizer "Fátima" e com a imagem de uma santa
  • Íman para segurar o telemóvel
  • Autocolante Milupa "Crianças a bordo"
  • Autocolante negro no faróis da frente com dois buracos redondos
  • Capa para o volante com cores berrantes
  • Capas para os bancos com bolas de madeira
  • Letras dos pneus pintadas de branco
  • Extintor (avariado) debaixo do banco
  • Terço pendurado no retrovisor
  • Porta CDs na consola
  • Alhetas nas escovas limpa pára-brisas
  • Ventoinha (não muito grande) no tablier 
  • Faróis traseiros pintados de preto
  • Autocolantes na traseira sentido obrigatório (esquerda) e sentido proibido (direita)
  • Ferradura na grelha presa com arame de enfardar
  • Suporte para reboque com bola de ténis verde
  • Pintar o espaço da coluna entre os vidros de preto
  • Pequeno espelho para o ângulo morto
  • Almofadinhas para o cinto de segurança vermelhas
  • Bloco de notas com ventosa e caneta Bic (pode ser laranja ou cristal) presa por uma mola
  • Fita anti-electricidade estática a pelo menos 5cm do chão
  • Naperon rendilhado no tabuleiro traseiro
  • Coisa feita em renda para o tabuleiro traseiro com um rolo de papel higiénico dentro

Thursday, April 14, 2011

É uma software house portuguesa concerteza!

Há coisas que me fazem confusão. Uma empresa com dez programadores e não usa source control?? Com vários milhares de loc (lines of code)?

- "Source control só complica, nós fazemos uns ZIPs..."
- "Bug tracking? Vamos mandando uns emails..."
- "Ambiente de desenvolvimento? Ambiente de testes? O que é isso? Nós vamos ao produtivo e alteramos..."
- "Rollback? O que é isso?"
- "Backups? Ah e coiso, de vez em quando faço uns ZIPs..."
- "Eu sei lá se dá para fazer restore a partir de um ZIP. Nunca foi preciso..."
- "Onde guardo os ZIPs de backup? Estão lá num directório na mesma máquina..."
Começo a explicar o que é source control:
- "branches? tags? Ui isso é muito complicado!"
- "Deployment? Então, copio para lá os ficheiros que foram alterados!"
- "Versões? Tenho file_v1.pl, file_v2.pl, file_v3.pl e vou mudando os nomes..."
- "Bateria de testes? Então, o programador faz sempre um teste ou dois quando está a programar..."
- "Testes regressivos? O que é isso??"
- "Coding standards? O que é isso?"
- "Como é que quer que eu saiba quando, por quem e porque razão esta linha de código foi alterada?"
- "Levantamento de requisitos? Troca-se uns mails com o cliente..."
- "Especificação? Para quê? Faz-se o software e logo se vê se era aquilo que o cliente queria..."
- "Claro, o programador é que desenha o user interface..."
- "Design? Para quê? O programador que escolha umas cores que fiquem bem..."
- "Gestão do projecto? Então, os programadores dividem as coisas entre eles. Depois vão à reunião com o cliente para saber o que falta..."
- "Como é que quer que eu saiba se o projecto está ontime? Na deadline logo vemos se está tudo feito ou não..."
- "Qualidade de software? Só tenho aquele papel ali na parede de HST, é isso?"
- "Bugs fechados? São aquelas coisas que o cliente já não chateia mais..."
- "Se este projecto dá lucro? Sei lá. Os programadores trabalham das 9-5 em tudo. No fim do ano a contabilidade diz-me se tive lucro"
- "Orçamento? Então, calculo a olho na primeira vez que converso com o cliente..."
- "Milestones? O que é isso?"
- "Arquitectura do sistema? O que é isso?"

As empresas de outras áreas (não de software) também trabalham assim?