A minha história com Linux é uma verdadeira novela, marcada por amor e ódio. Digna algumas vezes de Nelson Rodrigues e outras vezes lenta e demorada como uma história de Tolkien.
Eu sempre fui fã de software livre e já escrevi sobre isso. Aliás, quando escrevi sobre isso, comentei que após o Windows-XP original meu pifar, ao atualizar até o talo com Windows Update o teclado e mouse paravam de funcionar. Resolvi reinstalar o Windows-XP. Porém, impedido de atualizar tudo, acabei contraindo vírus ao comprar um Modem da Claro (outra hora comento sobre isto) e desta forma precisava formatar mais uma vez, não mais do que 30 dias da última instalação do Windows. Talvez tenha sido neste momento que eu decidi me rebelar. Botei o Ubuntu 9 (linux) e em bem menos tempo (levo aproximadamente 1 semana para instalar Windows, programas necessários e drivers), aproximadamente em 2 dias (isso sem experiência em Linux), eu já estava com meu ambiente pronto e isto de fato me conquistou. Mas não foi só isso e nem também só alegrias. Abaixo, mostro detalhadamente a minha experiência nesse combate e que servirá para outros usuários que queiram fazer ou passar por esta migração. Mas antes disso é bom ressaltar que esta foi finalmente minha primeira tentativa bem sucedida de migração, pois eu venho tentando a mesma coisa desde 98, porém sempre com olhos muito críticos. Eu jamais deixei instalado por muito tempo um Linux, e é a primeira vez que ele fica no meu computador sem ter uma versão do windows para fazer companhia.
A instalação é provavelmente a melhor parte. Se você tem Windows você insere o CD do ubuntu e como se fosse um jogo ou outro programa qualquer ele instala num fácil NNF (next, next e finish). Ele não danifica o Windows e fica com duplo boot. E, se você não gostar, basta ir no painel de controle e desinstalar o Linux.
Agora se você quer instalar ele como único SO, basta por o cd antes de iniciar o PC. A instalação é bem mais fácil que a instalação do Windows XP, inclusive achei sensacional a possibilidade de você testar o teclado na hora de escolher a configuração. No Windows você escolhe o teclado tipo ABNT2 e não tem como saber se tá certo, pois não tem onde testar.
A instalação do Ubuntu não é apenas do SO. Ao contrário do Windows, ele já instala dois navegadores (inclusive o Firefox que uso muito), programa para ler email, dezenas de jogos, programa para mensagens automáticas (compatível com MSN, GMAIL e ICQ), java, e dezenas de coisas que no Windows eu precisaria instalar um a um. Além disso ele reconheceu praticamente todos meus componentes, me poupando de ter que buscar e instalar os drivers antes de usar como é o caso com o Windows XP. Para ser mais claro, no meu caso faltou apenas a impressora/scanner. Itens reconhecidos automaticamente: Placa de Som, Placa de Vídeo, Monitor, Placa de Rede com Fio, Placa de Rede sem fio, Teclado e Mouse além dos habituais HDs e outros acessórios que qualquer OS reconhece.
Normalmente quando formato, eu busco a versão mais atualizada de cada software. Então por exemplo se vou instalar o Eclipse, no Windows sigo os seguintes passos:
No Ubuntu:
E melhor, no mesmo gerenciador eu instalo 80 a 90% de todos os programas que preciso, além de ficar fuçando dezenas de outros programas que não conhecia.
Porque ele em vez de comer 60GB do meu HD estava ocupando modestos 30GBs? Para responder isso, precisamos entender como o Windows trabalha:
No Windows, ao instalar um programa, ele determina uma área no HD para depositar seus arquivos. Por exemplo, “Arquivos de Programas\Firefox”. Imagina que um destes arquivos se chama MozilaFuncions.dll e ele pese 50MB. Ai você instala outro programa do mesmo fabricante, o FileZila, e na pasta do mesmo, a exata mesma dll MozilaFuncions.dll está lá, ocupando mais 50MB de seu precioso HD. O problema não termina aí. Imagine agora que você instala também o GTalk, e como o Mozilla é free, o google usa algumas funções do Mozilla Fundation, então? Lá vem de novo a dll MozilaFunctions.dll. Acredite, isto ocorre o tempo todo!
Ok, e no Ubuntu? No Ubuntu se o Firefox utiliza esta dll, então ele cria um projeto chamado MozilaFunctions.dll e diz que o Firefox depende deste projeto. Então quando você manda instalar o Firefox, ele já seleciona a instalação do MozilaFuncions.dll. Quando você vai instalar o Filezila ou o Gtalk, eles também dizem ser dependentes deste projeto (mozilaFunctions) , porém eles vêem que já está instalado e não baixam este arquivo.
Ok, isto é ótimo, ocupa menos espaço de HD, certo? Sim, além de você não precisar gastar banda da tua internet baixando os mesmos arquivos, outra vantagem é na atualização. Se no windows a dll sofre alteração, em pouco tempo o Gtalk, FileZila e Firefox vão pedir para atualizar. No Ubuntu ele atualiza apenas a dll, uma única vez!
Tá! Lindo e maravilhoso mas e se o fabricante não seguir esta regra? Alguns poucos softwares não seguem mesmo esta regra, mas por conciência dos desenvolvedores a maior parte (esmagadora aliás) utiliza deste sistema para gerenciar suas dependências. Claro, os usuários agradecem.
Ah e quem for fazer o teste fica um conselho. Utilize o terminal e o comando top para determinar o uso do CPU. Usar interfaces gráficas consomem muito CPU no linux e seu teste vai ficar capenga. Mas se quiser usar, fique ciente disto. O Task Manaer do Windows no máximo usa 2% da CPU, já o que vem no Ubuntu é mais complexo (e também mais mal feito) e come consideráveis 15% de CPU e por este motivo prejudica o teste. Então se puder use mesmo o terminal.
Alguns dos programas embutidos do Ubuntu são melhores que do Windows. Exemplos são o notepad, Firefox vs IE, sistema de email Evolution (apesar de não usar email client) vs o “bota fora” da MS. O Task Manager da MS, como disse, é muito mais leve que o do Ubuntu, embora o do Ubuntu seja bem mais completo o que me leva a dar um empate. Outro empate vai para o explorer vs nautilus pois o explorer é mais inteligente em algumas coisas porém o nautilus acessa quase todo tipo de protocolo (file system, ftp, ssh, etc) , além de que o nautilus trabalha em abas.
Neste item o Ubuntu perde, ele tem um problema grave de restauração de vídeo. (Ocorre se vc acidentalmente usar um driver de outro fabricante. Para drivers do mesmo fabricante a recuperação costuma funcionar.)
Outro grande problema em vídeo é que o fabricante ATI costuma não dar suporte adequado para Ubuntu. Se você tem uma placa recente e moderna então você não tem problema mesmo se tiver uma placa ATI. Agora se a sua placa for ATI e ainda for antiga… Você será obrigado a utilizar um driver genérico que limita muito as funcionalidades 3D. Tudo porque o controlador gráfico Xorg do Ubuntu passou recentemente por uma reformulação tremenda e a ATI decidiu simplesmente não fazer novos drivers para as placas de vídeo. De qualquer jeito, isso não isenta o Ubuntu, afinal se não tem novos drivers por que foi substituido o xorg??? Não deveria ser opcional para usuários hardcores com placas sempre atualizadas? As vantagens ganharam da extrema desvantagem que os usuários receberam? Por este motivo acho que o ponto mais fraco do Ubuntu é a compatibilidade com placas de vídeo, e por mais que se diga que não é culpa do SO, é, pois se as placas novas e antigas funcionavam bem (por mais que não 100%) no ubuntu 8.10 não tinha motivos para mudar as regras do jogo no meio do campeonato.
Outro problema, mas não tão grave é na impressora. Utilizo uma impressora chamada HP Laserjet 1020. É perfeita, foi reconhecida pelo SO, mas de vez em quando ela para de responder. Aí preciso ir no gerenciamento de impressoras e desabilitar e habilitar de novo e fica tudo bem. Erro bobo, mas digno de nota.
Imagine que você trabalha numa empresa onde caem pedras do alto do edifício o tempo todo, e as pedras são grandes o suficiente para te mandar pra UTI. Mas nada acontece se você utilizar um capacete.
A empresa exige que todos os funcionários usem um capacete para se prevenir e para tanto exigem que todos assinem um documento tirando a responsabilidade da empresa caso o funcionário desobedeça a regra de usar o capacete.
A princípio, parece que faz todo sentido, certo? Afinal, a empresa não pode se responsabilizar por um usuário desobediente que insiste em não utilizar o capacete. Mas esta é apenas a imagem que empresa vende. Aí você que é um funcionário da empresa, sabe como é por dentro.
Você não pode entrar com seu capacete, tem que usar o dado pela empresa. O capacete da empresa um dia vem feito isopor, qualquer coisa quebra. No segundo dia só vêm capacetes pequenos que não caberiam nem em uma criança. No terceiro dia o capacete não tem corda para amarrar debaixo do queixo, e só é possível usá-lo se você segurar ele o tempo todo. No quarto ….
Resulado, um dia todos decidem não usar capacete.
O linux parece esta empresa citada acima, ele tem uma seguança infalível, desde que você usuário jamais use o usuário root. Mas muitos programas só funcionam corretamente se você utilizar o root, muitas coisas só podem ser feitas usando o root, de modo que geralmente você ou loga usando o root ou está o tempo todo executando comandos como root.
O Eclipse foi minha maior decepção. Se você não usar o root ele não instala plugins, você não consegue selecionar o workspace inicial, entre outras coisas. Tornando a sua vida um inferno a menos que você se arrisque.
Outro dia fui ver um filme, rodei e não tinha plugin. Primeira coisa que me passou na cabeça foi “porque diabos inventaram a porra de codecs?” A segunda coisa foi “como vou achar este codec?”. A terceira foi “caralho, meu SO agora é linux, como vou fazer para instalar plugin, ainda por cima para linux?” . A quarta …. Apenas a última coisa que me passou pela cabeça foi apertar naquele botão piscante “procurar por plugins na web”. Isso porque no Windows isso NUNCA funciona. No Ubuntu a única vez que não funcionou foi quando abri um filme específico pra Windows Media Player (um doce para quem adivinhar o motivo hehe).
Concluindo, este foi um ponto positivo para o Ubuntu.
Um ponto negativo no Ubuntu é até idiota, não sei porque não melhoraram ainda. Ao copiar ou colar arquivos no nautilus, ele ignora atalhos (CTRL+C ou CTRL+X) se você apertar o atalho e sair da pasta muito rápido. No Windows, a prioridade de respeito a CTRL+C e CTRL+V é máxima, dando a impressão que o SO que controla isto e não o aplicativo. No Ubuntu se o aplicativo estiver ocupado, provavelmente a sua cópia de arquivos não funcionará.
Outra coisa que notei é que não funciona Control+Z no nautilus! Ele até tem a lixeira, mas se você excluir algo ele não retorna automaticamente se você apertar CTRL+Z e nem tem a opção voltar em menu algum. O jeito é ir até a lixeira e restaurar os arquivos apagados por lá (por isso é bom que sua lixeira não esteja muito cheia ^^)
Outro detalhe negativo do Ubuntu neste sentido é que quando você vai Abrir um arquivo ou Salvar Como, o mini-gerenciador que abre para manipular os diretórios e arquivos não tem a opção de explorar e salvar como, também não se pode renomear e outras coisas triviais no Windows.
E um bug! Quando abre a tela de abrir diretório, se você digita o caminho lá em cima e dá enter, ele mostra como se tivesse aberto o caminho com sucesso mas ele continua abrindo o caminho default. Para testar este bug aperte print screen, depois selecione Outra Pasta como destino, por último digite em cima um caminho válido diferente do default e aperte ok. Na tela seguinte o caminho que você digitou estará selecionado, porém ao dar ok novamente para confirmar ele salva no caminho default. Este bug induz seriamente o usuário ao erro e pode ocasionar dele perder algum arquivo. Principalmente se ele fizer isso e por algum motivo em seguida deletar o caminho default. Ou em caso de usuários mais inexperientes fazer eles perderem o documento simplesmente por não acharem e não entenderem o que ocorreu.
Um segundo bug ocorre no Nautilus, um erro que tem que reiniciar o SO para resolver. Ocorre que pseudo protocolos como trash e sftp passam a ser ignorados pelo gerenciador. Este erro, que ocorre comigo de tempos em tempos, é descrito em under-linux.
Uma das coisas que o Ubuntu peca é em suporte para legados. Foi assim com placa de vídeo e foi assim com meu scanner. O scanner eu consegui instalar seguindo estas dicas mas a solução não foi perfeita (assim com não foi a de vídeo).
Calculadora é um show a parte. Além da versão simples e da científica tem a Avançada, Programável e Financeira.
Esta é uma crítica bem maior ao Firefox do que ao Ubuntu. A comunidade do Firefox adora dizer que seu navegador é mais seguro do que o IE principalmente por soltarem diversas atualizações e atualizações de segurança quase diárias. Mas a história muda de figura no Ubuntu. Estou utilizando a versão 3.5.2 neste momento mas até semana passada eu usava a versão 3.0 (para windows tem a 3.5 há muito tempo). Simplesmente porque a atualização automática do firefox ou a atualização automática do SO não atualiza o firefox. Existe uma versão no sitem do Ubuntuzila que instala a última versão, mas até a semana passada como comentei para mim ainda não resolvia, ele não aceitava meus plugins. De qualquer maneira se alguém não quiser esquentar a cabeça, o mais fácil é aguardar até a próxima versão do Ubuntu prevista para outubro e que deve trazer o Fx 3.5 já instalado =)
Eu gosto de softwares livres, o Windows XP mesmo sendo pago e original apresentava diversas falhas que me causavam bastante trabalho, o Windows Vista é pesado e torra muitos recursos (dos quais eu não tenho), não tive muita opção senão, após pesar na balança me converter ao charme do pingüim. ^^
1 2 3 4 5 | #PHP VS JAVA //JAVA VS PYTHON /*C++ VS JAVA*/ 'JAVA VS .NET out.println("EU NAO SEI PROGRAMAR NADA!"); |
Eu tenho um amigo que é apaixonado por Python. Ele é muito gente boa e muito querido por mim e pela minha esposa e até é importante nos meios da comunidade Python. Mas se fosse apenas por ser nerd e gostar de Python provavelmente ele não me chamaria a atenção. Fato que gosto de conversar com ele e sua esposa sobre política, sobre economia, sobre trabalho e principalmente tudo sobre jogos. Jogos, sim, claro, ele é amante de jogos de tabuleiro e tem na casa dele uma estante recheada de jogos importados, uma pessoa destas pode ser uma má pessoa? A resposta é não =)
Mas voltando ao assunto original, ele defende muito Python e por 3X eu tentei aprender esta linguagem por conta das alfinetadas que ele dá. Mas não dá, simplesmente não dá. Não desce. Certa vez ele disse que foi a 1ª linguagem que aprendi foi Java e por isto eu não gosto de Python. Errado. A primeria linguagem que aprendi foi linguagem BAT do MS-DOS, depois foi Visual Basic, VBA, C++ e só então Java.
Então em outro momento ele disse “ah mas foi porque foi a última e você não teve mais paciência para aprender outras linguagens”. Errado também! Depois de Java eu ainda aprendi C#, PHP, lotus script e cold fusion. E coloco o Python em igualdade do cold-fusion em linguagens que não me descem a garganta.
Sei que vai ter muitos trolls que vão vir aqui pra me encher o saco, mas foda-se. Odeio Python. Se preciso, dou suporte (como já cansei de dar suporte na comunidade de L2J).
Aliás bem lembrado, a comunidade L2J começou a fazer scripts para quests em Python e terminou que ninguém conseguia dar suporte neles de tão mal escritos e confusos. Resultado? Todo script novo agora é em Java e muitos dos antigos foram convertidos para Java. Se Python fosse bom e fácil aparecia gente interessada em dar suporte. E até hoje tem vários scripts bugados em python no L2J que de tempos em tempos um programador Java refaz o código, pois os programadores de python mexem, mexem e a coisa toda continua porca. (para quem não sabe L2J é um projeto open source).
Mas ok, quais os argumentos? Dizer que uma comunidade migrou de python para java não é argumento, pois outras comunidades podem ter feito o contrário. Também não se pode jogar que linguagens scripts não são sérias devido apenas python. Tem o PHP por exemplo. Então vamos à eles:
Linguagens scripts exigem que o código seja aberto, afinal se não for aberto e sim compilado deixa de ser scripts. Muitas vezes ser aberto inviabiliza modelos de negócios. Exemplo que posso citar são jogos. Muitos jogos sobrevivem com o fechamento do código, seja para impedir que o jogador roube (em modo multiplayer) ou para impedir que o jogo seja alterado (devido a direito autorais).
Outra situação é quando o cliente não confia onde vai ficar o código, afinal, nem sempre o código fonte fica onde o cliente confia. Então bibliotecas de conexões a bancos são criadas para que ninguém enxergue senhas e dados mais pessoais. Esta não é a saída mais elegante mas é a mais aceita se visualizar a quantidade de projetos onde o segredo fica oculto na forma de linguagem de máquina, para projetos baratos as vezes é o suficiente.
Claro que existem outras situações onde manter o código compilado seja o ideal, como manter segredos de algorítimos complexos que levaram anos de pesquisa etc., mas queria apenas demonstrar que existem motivos. Mesmo que existam formas caras de contorná-los eles não deixam de ser motivos.
Para mim, linguagens sérias exigem que seja declarado variáveis. No PHP você não é obrigado a declarar a variável e nem recebe um erro caso ela seja usada e ainda esteja nula. Da mesma forma no JavaScript (embora em casos raros ele reclame). Situações como estas podem levar o programador ao seguinte erro:
1 2 3 4 5 6 7 | adminCount = getAdminCount(); (...) if(admCount < 0) { //remove deslogados admCount = admCount - getAdminLogoutCount(); } |
No exemplo acima, ele inicia a variável adminCount com a quantidade de administradors logados, e por um erro de digitação ele jamais entra no if onde atualizaria a variável que conta admins logados. Outro exemplo ainda pior é:
1 2 3 4 5 | if(noHaveAdminAces < 1) { //habilita acesso de admin, pois não foi bloqueado o acesso de admin (...) } |
No exemplo acima, um código pode levar a liberar acessos proibitivos no sistema, apenas porque a variável foi iniciada erradamente com zero. Outros erros podem fazer o programador perder horas valiosas do dia dele tentando descobrir a encrenca. Alguns scripts trazem a possibilidade de configurar isto, mas se o padrão é permissivo já é um erro! Por quê? Porque você depende da boa fé de que o servidor vai ter esta possibilidade de configuração, coisa que qualquer programador sabe que não funciona bem assim.
No Python (e acredito que em Ruby) e em outras linguagens mais novas, eles pegam um terceiro caminho. Você não é obrigado a declarar, mas é obrigado a dar um valor para ela antes de acessá-la. Resolve metade dos problemas, mas ainda leva os programadores ao erro. Esta situação pode levar a seguinte encrenca:
1 2 3 4 5 6 7 8 9 10 11 12 13 | noHaveAdminAccess = 0; //tem acesso de admin (...) if(userBanned ==1) { noHaveAdminAces = 1; //usuario banido remove o acesso de admin } (...) if(noHaveAdminAccess < 1) { //habilita acesso de admin, pois não foi bloqueado o acesso de admin (...) } |
Se reparar, inicialmente o usuário tem acesso de admin. Por conta de um erro, quando o usuário tem o status banido ele não remove o acesso de admin, no lugar disso ele cria uma nova variável com valor 1, valor que jamais vai ser lido (ou até pode ser lido se o erro ocorrer em outros lugares), causando uma tremenda falha de segurança e confusão.
São exemplos bestas, que criei de cabeça mas já passei por alguns casos, já tive que corrigir muita cagada em scripts por conta destas falhas de linguagem e me aborrece muito quando alguém vem defender linguagens scripts contra linguagens robustas como C, C++, Java e C#. Ai você pode dizer “Ah mas se programar direito não acontece isto!”, ok mas se a linguagem favorece programadores preguiçosos, que tipo de código você acha que vai cair nas tuas mãos pra arrumar?
Linguagens scripts costumam ignorar o fechamento de blocos, no caso de JScript e PHP se não me engano ambos permitem ignorar os últimos “fechas” de bloco. Tornando assim um perigo, pois se existe a falta de “}” nada garante que não esteja faltando mais coisas, ou elas não estejam tremendamente erradas.
Novamente o Python pega um terceiro caminho, no entanto outra vez ele só cria um novo caminho que na minha opinião mais atrapalha que ajuda. Para definir blocos ele usa apenas identação. Soa lindo na teoria mas uma merda na prática pois na teoria visualmente teria o mesmo efeito, um código:
1 2 3 4 | if(cont==1) { (...)bloco de comandos } |
seria aceito em linguagens que exigem apenas identação, ficando apenas assim:
1 2 | if(cont==1) (...)bloco de comandos |
Parece ótimo não precisar digitar os braços (ô preguiça) mas eu (opinião pessoal minha), acho extremamente deselegante depender do editor de texto, espaços e tabs pra marcar algo tão sólido como um bloco de códigos numa estrutura condicional.
Aliás da mesma maneira ele não tem terminador de linha “;” por exemplo, mas ai acho que a quebra de linha cumpre bem o papel visual.
OO que me perdoe, mas se tu quer desenvolver em OO puro, por favor use Smaltak. Tipologia de variáveis existem, não por acaso. Estão aí para garantir que o código será escrito sem erros. A maioria esmagadora dos scripts não exigem definição de tipos, e ai começa a encrenca:
1 2 3 4 5 6 | havePermission = "false"; if(havePermission) { (...)//libera permissão } |
O exemplo acima é apenas “um exemplo”. Existem outros, mas é apenas para demonstrar como podem ocorrer falhas de codificação esperando que o conteúdo seja um tipo e na realidade é outro.
A exigência de tipos causa um erro de compilação*, avisando ao programador que ele cometeu um engano, ou ele usou a variável errada ou esperou que a variável contivesse um tipo de valor (boleano no exemplo) e na realidade tem outro. Este tipo de coisa salva o programador de erros no futuro, e como tudo que pode ser deixado para depois, este erro pode causar desastres lá adiante.
*dependendo do editor, até um erro de edição. Porém como não podemos contar com o editor, o compilador segura as pontas.
Não irei citar aqui todos os casos, mas é fácil notar que linguagens scripts têm o intuito de acelerar a produção do código, nem que deixe passar alguns erros que estourem lá adiante. Esta aí algo que não curto, pois é o efeito borboleta passando propositalmente debaixo do nariz do programador. O erro vai passando pra ser resolvido depois, mas o depois não se sabe quem irá receber a bomba, talvez não seja você, ou talvez você não se lembre mais do que programou há um ano atrás. E aí você se mata em procurar o erro que poderia ter sido evitado já em tempo de compilação, ocasionando maior gasto para a empresa e para o programador.
Teve um sujeito que chegou para mim e disse “poxa você deveria fazer o site do Taulukko em Ruby, teria ficado bem melhor”. É como o líder do L2J falou uma vez que alguém disse o mesmo para ele a respeito de não ter feito a engine em C++ pela velocidade, “existe algum projeto em C++ para emular L2 que vingou ? Não né?” Mesma coisa. Meu servidor nem tem suporte a Ruby, eu não tenho conhecimento profundo na linguagem Ruby como tenho em Java, tenho centenas de bibliotecas e códigos prontos em Java, e o cara me fala que teria sido melhor se eu tivesse feito em Ruby? São pensamentos pequenos como estes que me fizeram criar este post. Eu não chego e falo que o Twitter teria menos baleias se fosse feito em Java, falo? Pronto falei!
Apesar disso respeito muito Ruby pois dentre as linguagens scripts é na minha opinião a mais fácil de achar erros e corrigir problemas. Mas também não trabalhei nela a fundo para poder levantar seus defuntos, mas conheço alguns dos seus defeitos, como no exemplo abaixo que é o slogan do site do Ruby:
1 2 3 4 5 6 7 8 9 10 11 | cidades = %w[ Londres Oslo Paris Amsterdão Berlim ] visitadas = %w[Berlim Oslo] puts "Ainda me falta " + "visitar " + "as cidades:", cidades - visitadas |
Onde você tem duas listas subtraindo uma da outra. Então você acredita que vai dar um erro? Errado, se você acha que vai dar a diferença de quantidade das duas listas? Errado de novo, ela exibe os nomes das cidades não visitadas, separadas com quê? Pois é… Se fosse uma linguagem menos preocupada com o desenvolvedor e mais com a consistência seria algo como:
1 2 3 4 5 6 7 | String cidades [] = { "Londres", "Oslo", "Paris", "Amsterdão", "Berlim" }; String visitadas [] = {"Berlim", "Oslo"}; pront( "Ainda me falta " + "visitar " + "as cidades:", EString.join(cidades.remove(visitadas),",") ); |
Onde o remove fica óbvio que está removendo os elementos da lista visitadas, e o join deixa óbvio que está transformando a lista num objeto string só separado por vírgula.
Eu acho que reclamar de lentidão é a coisa mais baixa que um programador pode fazer ao reclamar de alguma linguagem. Desde a criação do PC os processadores não param de acelerar a cpu, então o que é lento hoje não é amanhã. E se for, otimizações na engine tornam os códigos mais rápidos. O Java quando nasceu era dezenas e dezenas de vezes mais lento do que o C++, hoje ele chega a ser mais rápido que o C++ em programas que ficam muito tempo na memória, pois as otimizações possíveis em Java superam a velocidade do código já compilado em C++.
Mas é um fato. A princípio, toda linguagem script é lenta. Mas eu não deixaria de usar uma delas por conta disto a não ser que fosse algo muito pesado que seria rodado.
Pera lá! Não estou dizendo que são inúteis, acho a linguagem do Visual Basic 6 e Delphi porcas mas até eles têm sua vez. Cada caso é um caso. O PHP pela simplicidade de teste, e de desenvolvimento. Além da facilidade de montar servidores WEB, perto do Java, se tornou uma linguagem ótima para sites. Como exige pouco conhecimento de programação, programadores mesmo amadores dão suporte a complexos códigos. E comunidades bem estruturadas deixam a parte grossa do trabalho (a criação das engines que exigem mais cabeça e poderiam gerar erros mais difíceis de arrumar e contornar) para programadores mais antigos e treinados. Fazer um projeto Open Source em Java para web não é uma boa escolha. PHP mata a pau!
Mesma coisa para alguns scripts simples e básicos, onde se deseja permitir que programadores iniciantes dêem suporte. Estes podem ser feitos em linguagens como Python, PHP, Jscript e outros.
Agora, basear um projeto pago numa linguagem assim, acho uma medida errada. A menos que o foco do projeto seja criá-lo e depois não expandí-lo, deixando apenas que ocorra suportes pontuais. Aí necessitaria de mão de obra menos especializada e PHP por exemplo volta a ser uma boa escolha.
Claro que não. Mas elas geralmente priorizam a coerência do que facilitar a vida dos desenvolvedores.
C++ é extremamente complicada de desenvolver, mas tem diversos frameworks para te ajudar a não sofrer com ponteiros, manipulação de memória etc. Mas até você montar o ambiente…
C# é perfeita, e na minha opinião a melhor linguagem exceto por um ou outro detalhe. Mas o que queima o filme é que a melhor ferramenta para desenvolver em C# é da M$ (Visual Studio .Net) , e é anos luz mais atrasada do que outras similares para outras linguagens. Fora isto, tirando o Windows não existe nenhum OS que tem uma VM que rode o C# redondo, aliás, nem a VM da MS roda o .Net de forma redonda (e eu sei bem pois trabalho com isso há 5 anos).
Java é antigo, velho. Tem diversos conceitos que na época não existiram e foi costurado com o tempo, tornando a linguagem um mundo de remendos. Mas é onde tenho a maior parte das bibliotecas e ele funciona praticamente igual em qualquer OS. Além é claro que tem o Eclipse para ajudar (e muito).
VB 6, até hoje uso para pequenos programas visuais. Ele é de desenvolvimento rápido mas ele é um pouco a lá script. Também não tem necessidade de declarar variáveis mas resolvo isso colocando na ide para forçar a declaração. De qualquer jeito, só recomendo se for um programa muito pequeno, nada de projetos grandes. Ou então, para dlls COM+ para projetos WEB usando ASP (alias ASP é outra tranqueira).
Como vê, apesar de preferir o C# em matéria de conceito, prefiro programar em Java exceto quando preciso fazer algo visual extremamente pequeno para plataformas Win ai uso VB. Também uso muitos scripts quando é em páginas WEB, para subir ou executar pequenos programas em unix, ou até para alterar programas que usam scripts lua, python, pearl etc. Não tenho motivos para preferir uma linguagem e puxar sardinha de nenhuma delas, mas não me verá criando um projeto do zero em PHP ou Python a menos que o cliente assim exija (e olha que fiz esta merda uma vez para ver se perdia a birra com linguagens scripts e me fudi muito).
Eu acredito que as linguagens de scripts têm seus lugares bem definidos: scripts. Poderão tomar o lugar de linguagens sólidas como C, C++, C#, Java, VB, Delphy etc apenas quando o gasto de desenvolvimento (empurrado com a barriga para depois) for melhor controlado e contabilizado para que empresas sérias desenvolvam seus projetos sabendo o real custo dele. A partir daí, os demais problemas devem ser resolvidos gradativamente, até lá as linguagens compiladas sempre serão melhor aceitas em projetos grandes.
Scripts são voltados para ajudar o desenvolvedor e não a coerência, e na minha opinião DEVERIAM manterem esta filosofia. Pois scripts hoje são linguagens ótimas para ambientes onde se precisa de pessoas com pouca ou nenhuma experiência em programação para dar suporte, afinal ela é de fácil aprendizado e geralmente pouco exigente. No caso do PHP, é também uma linguagem boa para Opensource visto a facilidade de se achar servidores com suporte PHP e a facilidade de instalar aplicativos PHP em servidores apache (tente fazer o mesmo com #C ou com java para ver que trampo que dá).
Mas pare por aí. Dizer que o mundo move melhor com Python, Ruby ou PHP. Ou dizer que são linguagens praticamente perfeitas? Perfeitas para quem cara-pálida?
Então se você programa em linguagem script por favor, utilize o tempo que sobrou do seu projeto para tentar procurar os erros que o compilador deixou passar, em vez de usar para tentar convencer os demais programadores a trabalharem com a sua linguagem querida.

Foi inaugurado esta semana o Blog do Planalto, mas como diz o Tas em seu post, ele não é um blog. E não é MESMO.
Falta simplesmente o principal, ouvir o povo. Não aceita comentários (e obviamente ler os comentários dos outros), logo não é um blog, ao menos o conceito atual de site/blog, certo?
O pseudo-blog erra em não ter uma mão direta povo-governo, mas erra também em não ter uma mão direta governo-povo, ou você acha que algum politico está escrevendo diretamente no blog? Acorda!
O Blog do Planalto poderia ser uma atitude de exemplo e de boa vontade em ouvir o que o povo tem a dizer, mas fica apenas a frustração. Frustração que atingiu milhares de brasileiros, visto a queda do site devido ao excesso de acessos logo nas primeiras horas.
Claro que alguns poderiam dizer que os internautas, ou os mais preconceituosos trocariam a palavra internauta por brasileiro, não estão preparados para este canal. Eu discordo, na internet o “trolismo” faz parte da cultura, é normal e precisa ser maduro para saber tratar estes indivíduos. Então não falta dinheiro, nem tecnologia, só posso dizer que falta vontade. Ou então, eu estou errado, e algum projeto para colocar isto em prática já começou e não foi anunciado, NOT!
Ao menos todo o conteúdo é licenciado como Common (CC by SA 2.5), exceto se indicado diferente, tal como a imagem acima.
Update: só para constar que as opiniões deste post não são 100% compartilhadas pelo casal. rs. A Maíra também acha que seria mais interessante o blog ser aberto a comentários, mas também não acha que o blog é esse fiasco todo.