O Daily WTF coleciona histórias engraçadas, selvagens e / ou tristes do mundo da TI há 14 anos. Traduzi várias histórias que me pareciam interessantes. Todos os nomes e nomes de empresas foram alterados. A primeira parte está
aqui .
A primeira história. Apesar da avó ...
[ Original ]Clive comparou o conteúdo de sua conta bancária à taxa diária oferecida a ele, como fazem muitos freelancers, e decidiu que, em tais circunstâncias,
qualquer emprego lhe conviria. Uma vaga parecia quase tolerável: a companhia de seguros precisava de um novo pacote de software que permitisse cumprir alguns requisitos legais. Além disso, o gerenciamento precisava de alguém para ensinar aos desenvolvedores ferramentas e técnicas modernas ... por exemplo, versão de código.
Clive passou brilhantemente pela entrevista e uma semana depois foi trabalhar. Uma carta de alguém chamado Brandon estava esperando por ele na caixa de correio. Dizia: "Precisamos nos encontrar".
Brandon estava sentado em seu escritório, colado à cadeira ergonômica de meados dos anos 90 e como se estivesse se unindo a ele. Ele ergueu os olhos do monitor e olhou para Clive. "Você trabalha para mim."
Em frases concisas que consistem em monossílabos, Brandon explicou que nenhum dos que tomou a decisão de contratar se encontraria com Clive. Clive é responsável apenas por ele.
“Ok ... Então, quando fui contratado, eles disseram que você precisa configurar o Subversion. Devo começar com isso? - perguntou Clive.
"Não"
"Posso descobrir o porquê?" Você prefere outra coisa? Quer discutir opções?
"Não"
Clive esperou. Brandon não tinha pressa de revelar seu pensamento. Ele apenas olhou para Clive. Continuou a assistir e assistir.
Clive retornou lentamente ao seu cubo e começou a estudar a base de código. Ele estava localizado em um compartilhamento de rede e o controle de versão era "file.pl.old", "file.pl.old.old". Descobriu-se que o código está escrito em Perl e é ilegível mesmo para os padrões do Perl. Ele cresceu em uma cultura de "se analisar, começará", não continha comentários e não tinha absolutamente nenhum teste. O único aliado de Clive era Lee, outro especialista contratado que
também se reportou a Brandon, mas ele teve uma desvantagem de duas semanas na análise de código. Quando Clive ficou preso em algum lugar, ele olhou por trás da parede de seu cubo e perguntou a Lee.
Como uma geleira descendo de uma montanha, Clive avançou lentamente através do código. Semana a semana, ele gradualmente ganhou entendimento. E então veio uma carta de Brandon: "Precisamos nos encontrar".
"Você interfere na equipe de desenvolvimento", disse ele.
"O que?"
“Você e Li são muito barulhentos. Este é um escritório, não um clube de interesse.
“Isso é loucura. Acabei de lhe fazer perguntas sobre o trabalho! "Você quer que organizemos reuniões na sala de conferências apenas para fazer perguntas?"
"Sim"
Brandon ficou em silêncio e novamente começou a encarar Clive. Ele olhou, e olhou ... Clive entendeu a dica e fugiu para seu cubo.
Os requisitos eram confusos e mudavam constantemente, o que não era surpreendente. O único usuário que os conhecia exatamente era Carol, o que também não era surpreendente. Clive enviou-lhe uma carta com perguntas e tentou fazer o trabalho dele. Ele esperou alguns dias pela resposta dela, depois fez novas perguntas e enviou novas cartas.
Em uma semana, ele enviou cerca de uma dúzia de cartas, mas não recebeu resposta. Ele enviou novos para descobrir novas informações. Durante esse período, mais perguntas foram acumuladas. Clive tentou ligar para ela, mas encontrou um correio de voz. Ele tentou agendar uma reunião, mas Carol nunca aceitou seus convites.
E então veio uma carta de Brandon: "Precisamos nos encontrar".
"Carol diz que você está empurrando ela", disse Brandon.
"O que?"
“Você envia cartas para ela, mesmo depois que ela responde às perguntas. Ela disse que você convocou uma reunião, mas você não foi a ele. Isso deve ser parado.
“Isso é loucura. Ela nunca respondeu, eu posso mostrar minha caixa de entrada e provar.
"Carol não usa e-mail", explicou Brandon. “A estagiária imprime seus e-mails e ela responde pelo correio interno do escritório. Ela está muito ocupada. Você tem uma tarefa técnica. Siga e pare de incomodá-la.
“O que? "Você quer que eu implemente a solução sem sequer falar com um usuário que conhece todos os requisitos?"
Brandon olhou para ele. Ele continuou a assistir e ...
Com a ajuda de Lee nos próximos meses, Clive fez um progresso significativo. Ele aprendeu a lidar com o formato absurdo das datas (as datas eram contadas como o número de dias a partir de 3 de abril de 1974, e também o número de
meses da segunda-feira anterior e também o número de
semanas a partir do domingo seguinte). Eles lidaram com o fato de que ninguém deveria poder atualizar o Firefox para versões superiores a 3 e com o fato de que era impossível trabalhar horas extras, porque todos os servidores estavam desconectados exatamente às 18h. Carol não manteve contato, Brandon apenas olhou para eles e o resto da equipe os tratou como leprosos.
Algumas semanas antes da conclusão do contrato de seis meses, Clive estudou o conteúdo da unidade de rede da empresa em busca de uma planilha com dados de amostra. Ele encontrou uma mesa com o nome da empresa de recrutamento que o contratou e esperava que fosse algo útil. De certa forma, era.
A planilha era um relatório informando quanto a empresa de recrutamento recebe por Clive e Lee. As somas eram tão descaradas que faziam até um revendedor de carros usados corar. O documento incluía rastreamento de alterações e edição colaborativa, para que Clive pudesse ler comentários feitos por diferentes usuários.
No nível da gerência sênior, foram recebidos comentários com o espírito de "Não importa quanto você gaste". Os contadores alertaram: "Se fizermos isso, não teremos dinheiro sobrando para prêmios no final do ano!"
Brandon deixou sua própria nota: “Nosso negócio é muito específico. Eles não vão lidar. Desperdício de dinheiro.
Eles não vão aguentar .
Tudo se encaixou. Brandon não previu, mas
fez uma promessa . E ele irá cumpri-lo - nas próximas semanas, Clive e Lee não poderão fazer o que foi originalmente prometido.
Logo ele recebeu uma carta de seu recrutador. “Esta empresa ainda precisa de pessoal adicional. Você gostaria de estender o contrato por mais seis meses? ”
Ministrado por Brandon, Clive respondeu em breve: "Não".
A segunda história. Largue tudo impossível ...
[ Original ]Largue tudo impossível ...... e o que resta é XML, por incrível que seja.William Hogarth, uma perspectiva absurdaOs desenvolvedores têm muitos pontos fracos, e um deles é o seguinte: eles não gostam de dizer que algo não pode ser feito. Por isso, quando um cliente da
Glenn M , TelCo, perguntou se a tarefa dela seria
realmente impossível, em vez de pedir desculpas e agitar decisivamente a cabeça, ele respondeu: "Bem,
teoricamente ..."
Como resultado, Glenn escreveu o seguinte:
<value> <mult> <op> <mult> <op> <add> <op> <div> <op> <bitwise_and> <op> <baseNToInt base="16"> <regex> <op>(?:0x)?([0-9a-fA-F][0-9a-fA-F])\s*([0-9a-fA-F][0-9a-fA-F])\s*([0-9a-fA-F][0-9a-fA-F])\s*([0-9a-fA-F][0-9a-fA-F])</op> <op><getRowOid>.1.3.6.1.4.1.2011.2.217.1.4.1.1.6</getRowOid></op> <op>%4$s%3$s%2$s%1$s</op> </regex> </baseNToInt> </op> <op>8388607</op> </bitwise_and> </op> <op>8388608</op> </div> </op> <op>1</op> </add> </op> <op> <left_shift> <op>1</op> <op> <sub> <op> <bitwise_and> <op> <right_shift> <op> <baseNToInt base="16"> <regex> <op>(?:0x)?([0-9a-fA-F][0-9a-fA-F])\s*([0-9a-fA-F][0-9a-fA-F])\s*([0-9a-fA-F][0-9a-fA-F])\s*([0-9a-fA-F][0-9a-fA-F])</op> <op><getRowOid>.1.3.6.1.4.1.2011.2.217.1.4.1.1.6</getRowOid></op> <op>%4$s%3$s%2$s%1$s</op> </regex> </baseNToInt> </op> <op>23</op> </right_shift> </op> <op>255</op> </bitwise_and> </op> <op>127</op> </sub> </op> </left_shift> </op> </mult> </op> <op> <if> <op> <eq> <op> <bitwise_and> <op> <right_shift> <op> <baseNToInt base="16"> <regex> <op>(?:0x)?([0-9a-fA-F][0-9a-fA-F])\s*([0-9a-fA-F][0-9a-fA-F])\s*([0-9a-fA-F][0-9a-fA-F])\s*([0-9a-fA-F][0-9a-fA-F])</op> <op><getRowOid>.1.3.6.1.4.1.2011.2.217.1.4.1.1.6</getRowOid></op> <op>%4$s%3$s%2$s%1$s</op> </regex> </baseNToInt> </op> <op>31</op> </right_shift> </op> <op>1</op> </bitwise_and> </op> <op>1</op> </eq> </op> <op>-1</op> <op>1</op> </if> </op> </mult> </value>
Este é XML DDF, arquivo de definição de dados para o aplicativo de monitoramento do sistema suportado pela Glenn. Você vê, um sistema pode ler dados de qualquer dispositivo que suporte os protocolos Modbus / TCP ou SNMP, se tiver um arquivo DDF que defina os pontos de dados e como eles são exibidos. O esquema DDF contém os operadores aritméticos, booleanos, regulares e condicionais mostrados acima, necessários para o sistema saber como limpar os dados.
Lógica XML? Sim, este é o WTF em si. Mas o
verdadeiro WTF é o que o código acima
faz . A empresa monitorou um dispositivo que exibia valores de temperatura (isso é bastante simples de resolver), mas os representou como uma sequência de oito caracteres, indicando o valor hexadecimal de um número de ponto flutuante de 32 bits no formato IEEE-754. A tarefa que Glenn teve que reconhecer imediatamente como impossível foi converter esse valor maluco em uma forma numérica. No DDF, apesar de todo o seu poder expressivo, não havia um operador de conversão de tipo.
Portanto, Glenn escreveu o DDF mostrado acima, que fez o seguinte:
- Como a ordem dos bytes foi revertida, use
<regex>
para retorná-los à ordem com a qual você pode trabalhar - Use
<baseNtoInt>
para converter de octetString para uint_32 - Use
<bitwise_and>
e <right_shift>
para separar o bit de sinal, expoente e mantissa - Converta o bit assinado em +/– 1
- Eliminamos o deslocamento exponencial e, em seguida, executamos
<left_shift>
1 com esse valor - Divida a mantissa por 2 23
- Multiplique os três últimos elementos para obter o resultado final. Como
<mult>
e outros operadores aceitam apenas 2 operandos, as ações devem ser aninhadas
Na próxima vez que Glenn decidiu seguir a mesma tática, porque ouvira recentemente que a TelCo modifica o dispositivo para exibir a temperatura em número inteiro.
A terceira história. Equipe A (nti)
[ Original ]Na década de 1980, uma série de televisão chamada Equipe A foi filmada. Havia uma espreitadela dentro dele, capaz de enganar alguém. Para conseguir o que precisava, ele fez promessas verdadeiras (como marketing?). Havia um cara legal na equipe que poderia intimidar alguém para atingir seu objetivo. Ele sabia como atingir a meta, mas no fundo ele era um cara legal. A equipe tinha um líder que sempre poderia elaborar um plano e salvar a situação. E havia um cara um pouco louco (mas de um jeito bom) em quem você sempre pode confiar na batalha. De tempos em tempos, um assistente aparecia na equipe, envolvido em intervenção e inteligência. Esse grupo de caras trabalhava como uma engrenagem bem oleada. Eles não poderiam falhar! Eles eram um time!
A equipe “A” nunca escreveu documentação sobre a metodologia de gerenciamento de projetos. Não é de surpreender que todos sejam criminosos procurados.Alex conseguiu um emprego em um novo projeto para substituir um sistema desatualizado e sem suporte. Naturalmente, foi afirmado que a empresa "procura fazer tudo certo!" O projeto é totalmente financiado. A equipe terá o equipamento e o pessoal necessários para realizar o trabalho. Há suporte total para seis níveis de liderança, além de todos os usuários. Alex estava otimista.
A primeira coisa que a empresa fez foi passar vários meses coordenando entre todos esses incontáveis níveis de liderança, usuários finais, pessoas de apoio, veteranos que apoiaram o projeto (para que pudessem explicar os problemas que pioraram o antigo sistema) e os três arquitetos do novo sistema. A nova arquitetura foi extensivamente documentada, aprovada e assinada por todos os itens acima. Uma revisão crítica foi conduzida por uma agência independente de auditoria reguladora de terceiros para garantir que as autoridades reguladoras estivessem confiantes de que a abordagem correta havia sido adotada.
Em um documento de oito páginas, as recomendações para o desenvolvimento de código foram descritas em detalhes (como: opções de formatação de código, convenções de nomenclatura, testes de unidade, cobertura de código e outros aspectos semelhantes que são importantes para a equipe). O documento foi revisado e deve ser seguido por todos que trabalham no projeto.
O início do projeto foi bom.
A primeira tarefa foi contratar desenvolvedores para a equipe. Para fazer isso, a empresa procurava (muito longe) especialistas no exterior para encontrar o talento mais barato possível. Afinal, todos podem ser treinados, certo? Uma equipe de 11 desenvolvedores tinha 13 anos de experiência e uma liderança com cinco anos de experiência foi contratada para gerenciá-los.
A próxima decisão importante foi a escolha do banco de dados a ser usado. A empresa usou ativamente três. Como todos os bancos de dados foram armazenados em servidores centralizados, um deles foi imediatamente excluído: o equipamento dos servidores de banco de dados era excessivamente poderoso para lidar com a carga esperada dentro de um período de tempo razoável. Dos dois restantes, um dos membros da equipe usou ativamente um. Eles conheciam sua sintaxe, esquisitices e limitações. O terceiro foi configurado incorretamente e, portanto, tinha uma reputação de não ser confiável. No entanto, ela também era o padrão corporativo. Apesar das objeções da equipe, um terço foi escolhido.
O gerenciamento de projetos decidiu que o controle de qualidade poderia ser recrutado posteriormente.
Finalmente, é hora de implementar uma estrutura detalhada. O líder da equipe offshore decidiu que você pode economizar muito tempo se criar o design rapidamente, de acordo com as solicitações. Obviamente, os arquitetos eram contra, mas o gerente do projeto concordou.
Os arquitetos começaram a construir o mecanismo do controlador e outros princípios fundamentais do projeto. A equipe júnior, que deveria criar uma fila de muitos sistemas remotos para entrada, combinação, filtragem e pré-processamento de dados, decidiu que faria melhor do que o que está escrito na documentação de arquitetura e começou a desenvolver sua própria maneira de executar operações. Sem dizer isso aos arquitetos ou à gerência.
Chegou a hora de verificar o primeiro sprint e, durante a revisão do código, muitos tipos de "bandeiras vermelhas" foram descobertos. Junior Lead disse que a documentação arquitetônica era apenas uma recomendação que ele ignorou para atender aos desejos dos desenvolvedores. Naturalmente, isso provocou uma reação do tipo "você realmente está aí ...?" e um monte de cartas na cadeia de liderança. Mas o gerente de projeto e a liderança acima não pareciam estar interessados nisso: eles disseram que os juniores não deveriam ter feito isso, mas confiavam neles.
O trabalho continuou. Os arquitetos continuaram apontando falhas e defeitos de implementação que eram incompatíveis com os requisitos. Todas as ofertas foram ignoradas porque o líder da equipe offshore disse: “O Google está promovendo uma atmosfera de inovação e criatividade; nós precisamos fazer isso também! ” Ele foi lembrado de que o Google é (na maioria das vezes) o "think tank" e o líder trabalha com um projeto estritamente padronizado em um setor estritamente regulamentado. Essa arquitetura, que foi aprovada por mais de quarenta gerentes, não é uma opção ou recomendação, mas um requisito. Que este não é um jardim de infância, onde a criatividade é incentivada - você precisa aderir ao plano aprovado! Não estamos falando sobre como escrever corretamente um subprocedimento ou encapsular um objeto, mas esse processamento de encadeamento foi usado incorretamente e nos lugares errados, e o acesso aos bancos de dados e às comunicações entre processos não será escalável. O que você precisa não é criar vários processos, mas apenas usar threads. Que você não deve usar arquivos como semáforos simplesmente porque eles fizeram isso na escola. E a lista ainda será longa.
Mas nada disso foi percebido. Os desenvolvedores de junho reclamaram que, ao criar a arquitetura, eles não levaram em consideração suas opiniões, então continuarão a ignorá-la (com a bênção de sua liderança). O gerente de projeto continuou a dizer que estava ciente dos problemas, mas não fez nada com eles. Problemas foram relatados na cadeia, mas ninguém fez nada. Afinal, todos na equipe têm o mesmo direito de voto.
No mundo real, se um aluno pensa que o professor está enganado, ele não muda sua nota. O estagiário corta onde o cirurgião o mostra, e não o contrário. O general não discute estratégia com a classificação geral. Se você ingressar em um sindicato e, como novato, exigir os mesmos poderes que os líderes sindicais, ficará ao lado de Jimmy Hoff
[um líder sindical americano que desapareceu subitamente em circunstâncias misteriosas] . A experiência fala com pontos de exclamação. A inexperiência fala com os interrogadores.
Mas não nesta "equipe".
Os juniores continuaram a fazer o que achavam melhor, ignorando todos os pedidos dos arquitetos. A maior parte do código foi escrita e copiada várias vezes, porque os jones não conseguiram levar em conta tudo na primeira vez. Desenvolvedores mais experientes saberiam com o que contar. Após 8 meses, o projeto sofreu tanto dano que era simplesmente impossível alcançar os requisitos mais complexos e, em um projeto de desenvolvimento iniciado do zero, foi necessário reverter um mês atrás.
Nessa época, o gerenciamento sucumbiu às solicitações e solicitou a vários usuários comerciais que escrevessem testes em nível comercial (por exemplo, uma planilha que pode ser enviada ao JBehave para testes do JUnit). Os desenvolvedores forneceram código e alguns exemplos simples em planilhas. Os arquitetos disseram que precisavam contratar funcionários de controle de qualidade porque os usuários raramente sabem como lidar com casos limítrofes, problemas de precisão etc. Mas não se podia gastar dinheiro. Após seis meses de operação, os usuários comerciais disseram que todos os testes para todo o aplicativo (ou seja, toda a tarefa técnica) estavam prontos. Apenas olhando para ele, foi possível entender que eles não levavam em conta casos limítrofes, exemplos vazios, problemas de precisão e a maioria dos outros aspectos que geralmente exigem testes. De fato, eles colocaram todos os registros que poderiam teoricamente (do ponto de vista deles) existir em um enorme teste de aprovação / reprovação. Obviamente, quando algo muda e o fracasso inevitavelmente ocorre, não há como descobrir onde aconteceu.
Finalmente, as coisas foram tão longe que os arquitetos construíram uma parede física entre as partes do aplicativo com o código de configuração (escrito por uma equipe offshore) e o mecanismo principal (criado pelos arquitetos). Imediatamente após o mecanismo principal começar a triturar dados, cada variável no sistema foi redefinida para uma tabela de estado no banco de dados, para que, em caso de problemas inevitáveis, os dados de entrada fossem exibidos e os desenvolvedores externos pudessem receber uma solicitação de correção. Pelo menos dessa maneira, eles poderiam isolar o mecanismo principal do lixo.
O ministério economizou uma tonelada de dinheiro com o uso de mão-de-obra barata, a falta de um departamento de controle de qualidade e o uso de um banco de dados "politicamente sólido". Obviamente, todo o código de configuração escrito pela equipe offshore foi terrível. A maior parte foi difícil de aprender, manter, depurar e melhorar.
O produto ainda não foi lançado e os usuários já estão reclamando sobre o diagnóstico e a correção de problemas por muito tempo (esse foi um dos principais motivos para reescrever um projeto antigo). E se a reescrita não resolveu a principal tarefa de reescrever, provavelmente algo deu errado ...
A quarta história. Passar o ponteiro nulo
[
Original ]
Maxine estava com problemas para exibir o site em um navegador com o complemento NoScript. Isso não é surpreendente - alguns navegadores podem não funcionar corretamente com o NoScript, mas foi surpreendente que o navegador tenha lançado exceções de Java. Quando você ativa o JavaScript, a página de erro desaparece, mas como está? A falta de JavaScript leva a exceções de Java!?
Ela abriu o código da página e descobriu que o servidor estava esperando um parâmetro "innerCHK"; provavelmente algum tipo de sessão ou token de segurança que deve ser passado na string de consulta da URL. Caso contrário, o servidor retornará uma página de erro exibindo java.lang.NullPointerException. Felizmente, os desenvolvedores de front-end criaram o seguinte
excelente pedaço de JavaScript para resolver o problema:
// Verificação de erro
if (document.body.innerHTML.indexOf ('java.lang' + '. NullPointerException')! = -1) {
if (document.location.href.indexOf ('innerCHK =') == -1) {
document.location.href = document.location.href + "& innerCHK =" + Math.random () * 10000;
}
}
// Finalizar verificação
Mas isso é apenas a ponta do iceberg; a página estava cheia de antipadrões, rodas reinventadas, rodas sobressalentes e pneus furados. Tudo isso foi mantido em
fita . Para ter uma idéia do estilo de algumas conversões estranhas de strings e do antipadrão favorito dos desenvolvedores - fechando scripts apenas para abrir um novo na próxima linha, vamos dar uma olhada em como o Dojo é importado. Observe que o cookie Dojo é importado.
<tipo de script = "text / javascript">
if (typeof dojo == "undefined") {
document.writeln ('<scr' + 'ipt src = "' + '/wps/themes/./dojo/portal_dojo/dojo/dojo.js' + '"> </ scr' + 'ipt>');
}
if (typeof dijit == "undefined") {
document.writeln ('<scr' + 'ipt src = "' + '/wps/themes/./dojo/portal_dojo/dijit/dijit.js' + '"> </ scr' + 'ipt>');
}
</script>
<tipo de script = "text / javascript">
dojo.require ("dijit.form.Button");
dojo.require ("dojo.cookie");
//dojo.require("dijit.form.DropDownButton ");
dojo.require ("dijit.Dialog");
dojo.require ("dijit.form.TextBox");
dojo.require ("dijit.form.CheckBox");
dojo.require ("dijit.form.ComboBox");
</script>
Alguns, se não todos os links CSS, são tratados dessa maneira. Encontrei no código fonte pelo menos três ocorrências (idênticas). Repita Dojo.cookie é importado.
<nome do script = "DojoEnable_script" idioma = "JavaScript"> if (typeof dojo == "undefined") {
dojo.require ("dojo.cookie");
dojo.require ("dojo.parser");
djConfig = {parseOnLoad: false, isDebug: false};
document.write ("<script src = 'http: //www.******************.com: 80 / ps / PA_WPF / factory / dojo / dojo / dojo.js '> </ "+" script> ");
document.write ("<link rel = 'stylesheet' type = 'text / css' href = 'http: //www.******************: 80 / ps /PA_WPF/factory/dojo/dojo/resources/dojo.css '/> ");
document.write ('<link rel = "stylesheet" type = "text / css" href = "http: //www.****************.com: 80 / ps /PA_WPF/factory/dojo/dijit/themes/tundra/tundra.css "/> ');
document.write ('<link rel = "stylesheet" type = "text / css" href = "http: //www.****************.com: 80 / ps /PA_WPF/factory/dojo/dijit/themes/tundra/tundra_rtl.css "/> ');
dojo.addOnLoad (function () {if (! document.body.className) document.body.className = 'tundra'});
}
Alguém disse uma vez que se você quiser resolver um problema com expressões regulares, terá
dois problemas. Eu acho que, dizendo "dois", ele subestimou a situação.
var locale = 'en'.replace (/ _ /,' - '). replace (/ iw /,' he '). toLowerCase ();
Lembre-se de que as crianças sempre usam nomes bem pensados para constantes! Números mágicos são ruins. Exceto 2008, está tudo bem com ele.
if (typeof (MONTHS_IN_YEAR) == 'indefinido')
{
MONTHS_IN_YEAR = 12;
}
if (typeof (isDisableDate) == 'indefinido') {
var isDisableDate = função (data, ano, mês, iday)
{
if (date.getFullYear () == 2008)
{
return true;
}
retornar falso;
}
};
Nenhum aplicativo mal implementado será concluído sem sua biblioteca DateTime mal implementada. Deve haver algum tipo de lei científica sobre isso.
var month = nova matriz (12);
mês [0] = "1";
mês [1] = "2";
mês [2] = "3";
mês [3] = "4";
mês [4] = "5";
mês [5] = "6";
mês [6] = "7";
mês [7] = "8";
mês [8] = "9";
mês [9] = "10";
mês [10] = "11";
mês [11] = "12";
if (typeof (MONVALUE) == 'indefinido')
{
MONVALUE = nova matriz
("Jan",
"Fev",
"Mar",
"Abr",
"Maio",
"Jun",
"Jul",
"Agosto",
"Set",
"Outubro",
"Nov",
"Dez");
}
// função converte a data de str em Num
função Month2Num (mês)
{
if (month == "JAN") retorna "01"; if (month == "FEB") retorna "02"; if (month == "MAR") retorna "03"; if (month == "APR" ) retorna "04"; se (mês == "MAIO") retorna "05";
if (month == "JUN") retorna "06"; if (month == "JUL") retorna "07"; if (month == "AUG") retorna "08"; if (month == "SEP" ) retorna "09"; se (mês == "OCT") retorna "10";
if (mês == "NOV") retorna "11"; if (mês == "DEC") retorna "12";
}
O código contém muitos estilos CSS (geralmente duplicados), por exemplo, esse não é um estilo muito azul.
div.wpfThemeBlueBackgroundPanelTable
{
fundo: # F6F9FC;
preenchimento: 10px;
}
/ * ---- Painel azul ---- * /
table.wpfThemeBlueBackgroundPanelTable
{
fundo: # F6F9FC;
preenchimento: 10px;
}
A seguir, estão duas matrizes idênticas, das quais apenas uma é usada.
var arr_location_001 = nova matriz ();
var arr_location_002 = nova matriz ();
arr_location_001 ['AU'] = {valor: 'AU', título: 'austrália', texto: 'Austrália'};
arr_location_002 ['0'] = {value: 'AU', título: 'australia', texto: 'Australia'};
arr_location_001 ['CA'] = {valor: 'CA', título: 'Canadá', texto: 'Canadá'};
arr_location_002 ['1'] = {value: 'CA', título: 'canada', texto: 'Canadá'};
arr_location_001 ['CN'] = {valor: 'CN', título: 'china', texto: 'China'};
arr_location_002 ['2'] = {valor: 'CN', título: 'china', texto: 'China'};
arr_location_001 ['FR'] = {valor: 'FR', título: 'france', texto: 'France'};
arr_location_002 ['3'] = {valor: 'FR', título: 'france', texto: 'France'};
arr_location_001 ['HK'] = {valor: 'HK', título: 'hong_kong', texto: 'Hong Kong'};
arr_location_002 ['4'] = {value: 'HK', título: 'hong_kong', texto: 'Hong Kong'};
/ * fragmento de muitas linhas de código semelhante * /
Aqui está outro pequeno script bonito que conseguiu evitar muito, incluindo suas próprias tags de script! O desenvolvedor ganha pontos de bônus se ele o escreveu em uma camisa de força, embarcada em um caixão cheio de escorpiões, pendurado em um helicóptero sobre o Hudson. (Na verdade, essa pode ser a explicação mais lógica para a maior parte do código.)
Função <SPAN name = "onloadScript"> <entrada tipo = "oculto"> função onSelectInfo (calendário, data, data do elem) {
elem_date = document.getElementById ("Day_NArr");
elem_mon_year = document.getElementById ("Month_NArr");
hidden_elem = document.getElementById ("temp_date_NArr");
doOnSelect (calendário, data, elem_date, elem_mon_year, hidden_elem);
}
Calendar.setup (
{
inputField: "temp_date_NArr", // ID do campo de entrada
ifFormat: "% b,% e,% Y",
onSelect: onSelectInfo,
range: [currentYear, nextYear],
dateStatusFunc: dateStatusHandler,
botão: "cal_dep" // ID do botão
}
);
var _InfoVerAccurateFunc = clone (precisionDate);
initializeDate (nova matriz ('Month_NArr', 'Day_NArr'), _InfoVerAccurateFunc); ">
<tipo de script = "text / javascript">
Lembre-se de todo o dojo.cookie importado acima? Alguém adicionou uma função de biblioteca para ler cookies.
No entanto, alguém considerou necessário escrever uma função de copiar e colar Get_Cookie na Internet, mas não uma vez, mas quatro vezes! função Get_Cookie (nome_da_ verificação) {
// primeiro dividimos esse cookie em pares nome / valor
// nota: document.cookie retorna apenas name = value, não os outros componentes
var a_all_cookies = document.cookie.split (';');
var a_temp_cookie = '';
var cookie_name = '';
var cookie_value = '';
var b_cookie_found = false;
para (i = 0; i <todos os_cookies.length; i ++) {
// agora vamos separar cada par nome = valor
a_temp_cookie = a_all_cookies [i] .split ('=');
// e apara os espaços em branco esquerdo / direito enquanto estamos nele
cookie_name = a_temp_cookie [0] .replace (/ ^ \ s + | \ s + $ / g, '');
// se o nome extraído corresponder a check_name passado
if (cookie_name == check_name) {
b_cookie_found = true;
// precisamos lidar com o caso em que o cookie não tem valor, mas existe (no = sign, ou seja):
if (a_temp_cookie.length> 1) {
cookie_value = unescape (a_temp_cookie [1] .replace (/ ^ \ s + | \ s + $ / g, ''));
}
// note que nos casos em que o cookie é inicializado, mas sem valor, é retornado nulo
return cookie_value;
quebrar;
}
a_temp_cookie = nulo;
cookie_name = '';
}
if (! b_cookie_found) {
return null;
}
}
Eu acho que o método de desenvolvimento de software usado por essa equipe é um sistema recém-criado chamado “Dolby nas teclas CTRL-C e CTRL-V !!!!!! 11 !!!! 11! 11”. Estou certo de que, no futuro próximo, ele substituirá o Agile.A quinta história. Robôs humanos
[ Original ]Durante a formação da SuperbServices, Inc, seus negócios floresceram. Foi uma benção e uma maldição; como em qualquer startup, havia mais trabalho do que mãos. O departamento de vendas não pôde desistir de seu sucesso, então os técnicos tiveram que se adaptar.O CEO da SuperbServices, Inc deu a Roland uma tarefa séria que poderia salvar a empresa, ou pelo menos a saúde mental dos funcionários. "Precisamos automatizar todo o processamento para que possamos nos concentrar na prestação de serviços", disse o CEO. “A coisa mais valiosa conosco é nossos serviços, e todo o resto é desnecessário. Você precisa automatizá-lo, e é isso que você fará. Você cooperará com robôs humanos para automatizar tudo: confirmação de operações, compras, transações de fundos, e-mail do cliente - é tudo! ”"Com ... robôs humanos?"Roland tem uma nova fobia. O departamento de servidores da empresa era extraordinariamente excêntrico, mesmo para os padrões do setor. Apenas alguns viram seus funcionários, e apenas rumores estranhos chegaram a Roland.Quando Roland bateu na porta da sala do servidor, a câmera de vigilância acima de sua cabeça ganhou vida e a voz impassível do robô perguntou: "O QUE VOCÊ ESTÁ PROCURANDO?"“Uh, oi ... eu sou Roland, gerente de projetos. Parece que nós, ou quem você está aí, devemos automatizar as tarefas? ”“O QUE VOCÊ NOS OFERECE?” Respondeu a voz ameaçadora do metal."Bem, uh ... robôs amam rosquinhas?" Eu tenho comigo. É tudo o que existe. ""PASS". A trava eletrônica na porta se abriu com um clique. Roland puxou a porta na sua direção, e o ar gelado explodiu por trás. Milhares de luzes e racks cintilaram lá dentro, perto havia uma pequena mesa. Uma luz brilhou acima da mesa. "OFERECE AQUI", disse a metralhadora das sombras.Roland colocou a caixa de donuts na mesa e se afastou lentamente. Um grito de "OBRIGADO!" Veio detrás dele. Roland deu um pulo. O homem insignificante com um modulador de voz riu e pegou um donut."Oi Roland, eu sou Roy", disse ele, deixando de lado o modulador. "Não temos muitos visitantes, então gostamos de zombar deles. Bem, você precisa automatizar alguma coisa?Roland ficou surpreso com o quão comum Roy era, e não que ele fosse realmente humano. "Ah, sim, o CEO disse que você trabalha muito com robôs e que podemos usá-los para automatizar tudo o que podemos", Roland descreveu os requisitos e especificações.Roy suspirou. “É uma pena desapontá-lo, mas realmente não temos nada a ver com robôs, não importa o que o gênero pense. Ele insiste que Ruby é o nome do robô, embora seja apenas uma linguagem de programação. Mas a maioria desses processos podemos automatizar. Dê-nos duas semanas, o máximo de rosquinhas e bebidas energéticas que pudermos consumir, e podemos lidar com isso. ”Nas duas semanas seguintes, Roland trouxe as ofertas solicitadas e recebeu em troca informações sobre o andamento e demonstrações das funções. Roy e outros robôs humanos escreveram o código, e logo a montanha de papéis que todos no topo estavam fazendo se mudaram para os servidores no porão. Roland explicou que a maior parte do trabalho foi realizada por "robôs humanos", mas o CEO elogiou seus esforços."Roland, a obra-prima já foi concluída, agora essas máquinas puxam as alavancas que acionam nossos negócios", o diretor geral deu um tapinha nas costas dele. “Sua recompensa será um novo projeto - outro projeto com a maior prioridade. Nosso departamento financeiro não lida com o volume de transações. Conversei com o diretor financeiro e ela quer que você e o pessoal do robô automatizem o novo produto que compramos - MoneyWorx. Não me decepcione! "Roland voltou para a sala do servidor. Se o projeto de automação anterior era tão simples, tudo será o mesmo, certo? Ele mostrou a Roy as demandas.A pele de Roy bronzeada à luz dos monitores ficou ainda mais pálida. “Isso é ruim, muito ruim! Perigo! - gritou Roy. Ele acenou com as mãos horrorizado. “Este não é o MoneyWorx, mas o MoneyDoesntWorx. Mesmo quando os serviços estão em execução, eles exigem tokens RSA-SecurID. Alguém deve inserir manualmente o código "."Manualmente?" Ou seja, para o sistema funcionar, alguém deve estar na linha?Sim. Usamos três tokens SecurID; geralmente, quando o MoneyWorx pede um novo código, deve haver três pessoas na linha. ”"Então não vai funcionar. Se, nas transações, as pessoas tiverem que fazer ligações noturnas, o CEO ficará furioso. E ele já assinou um acordo - precisamos garantir que o sistema funcione sem ligar para as pessoas. ”Roy abriu o homem da energia e estremeceu. “Dê-me um fim de semana, vou pensar nisso. E eu vou precisar de mais disso - ele balançou a jarra. "E este", ele apontou para uma caixa de donuts.Roland apareceu no fim de semana e fez suas ofertas. Roy os aceitou, mas não disse nada. Robôs humanos estavam ocupados demais para conversar. Quando chegou segunda-feira, Roland voltou com novos donuts e bebidas energéticas. "Eureka!" Roy exclamou quando Roland entrou. "Deixe-me mostrar minha obra-prima!"A "obra-prima" era uma caixa de rosca vazia, colocada ao lado. Os tokens RSA-SecurID foram colados na caixa. Todo o sistema foi instalado na frente de uma webcam barata. "Quando o MoneyJerks exigir um novo token de dois fatores, alguém poderá acessar remotamente esta máquina, verificar os tokens e inserir o código correto."“Você não acha que esta caixa precisa ser protegida por senha?” Roland sugeriu.“Você acha que os usuários se lembrarão de como fazer login?” Roy objetou.Provavelmente foi a idéia mais idiota de que Roland já ouviu falar, mas ele o relatou no andar de cima e mostrou uma demonstração de soluções no escritório do CEO. Depois que ele se desconectou do carro com uma webcam, ele se encolheu, esperando a birra.“Isso é demais! Eles voltaram seus olhos robóticos para essas merdas, e agora ninguém na empresa precisa dizer ao MoneyWorx o que fazer! Bom trabalho, Roland. Me parabenize pelas pessoas robóticas. O robô deles é apenas um milagre.Roland ficou feliz por o trabalho ter sido concluído, mas não conseguiu se livrar da sensação de que havia cometido um erro terrível. A segurança financeira da empresa estava nas mãos de uma webcam barata, sem nenhuma proteção, exceto pela falta de um endereço IP público.Quando o desastre finalmente eclodiu, ele não assumiu a forma de uma transação fraudulenta. Uma caixa de donuts caiu na noite de quarta-feira. Roland teve que ligar para Roy, que dirigiu para o escritório e colocou a caixa de volta no lugar. Depois de analisar as causas da falha, Roy colocou a caixa no rack do servidor com fita isolante, garantindo assim um tempo de atividade constante.