No podcast 73 , Joel Spolsky e Jeff Atwood discutem, entre outros assuntos, "cinco coisas que todos deveriam odiar em sua linguagem de programação favorita":
Se você está satisfeito com sua cadeia de ferramentas atual, não há motivo para mudar. No entanto, se você não pode listar cinco coisas que você odeia na sua linguagem de programação favorita, então eu argumento que você ainda não a conhece o suficiente para julgar. É bom estar ciente das alternativas e ter um olhar crítico saudável para o que você estiver usando.
Sendo curioso, fiz essa pergunta a qualquer candidato que entrevistei. Nenhum deles foi capaz de citar pelo menos uma coisa que odeia no C # ¹.
Por quê? O que é tão difícil nesta questão? É por causa do contexto estressante da entrevista que essa pergunta é impossível de ser respondida pelos entrevistados?
Existe algo nessa pergunta que a torna ruim para uma entrevista?
Obviamente, isso não significa que o C # seja perfeito. Eu tenho uma lista de cinco coisas que odeio no C #:
A falta de número variável de tipos em genéricos (semelhante a
params
argumentos).
Action<T>
,
Action<T1, T2>
,
Action<T1, T2, T3>
,
⁞ Sério ?!
Action<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>
A falta de suporte para unidades de medida, como em F #.
A falta de propriedades somente leitura. Escrever um
private readonly
campo de apoio toda vez que eu quero uma propriedade somente leitura é chato.A falta de propriedades com valores padrão. E sim, eu sei que posso inicializá-los no construtor sem parâmetros e chamá-lo de todos os outros construtores. Mas eu não quero.
Herança múltipla. Sim, causa confusão e você não precisa disso na maioria dos casos. Ainda é útil em alguns casos (muito raros), e a confusão se aplica também (e foi resolvida em C #) à classe que herda várias interfaces que contêm métodos com o mesmo nome.
Tenho certeza de que esta lista está longe de estar completa, e há muito mais pontos a serem destacados, e especialmente muito melhores do que os meus.
People Algumas pessoas criticaram alguns assemblies no .NET Framework ou a falta de algumas bibliotecas no framework ou criticaram o CLR. Isso não conta, já que a pergunta era sobre a própria linguagem e, embora eu pudesse aceitar uma resposta sobre algo negativo no núcleo do .NET Framework (por exemplo, algo como o fato de não haver interface comum para TryParse
isso, se você deseja analisar uma string para vários tipos, precisa repetir-se para cada tipo), uma resposta sobre JSON ou WCF é completamente fora de tópico.
Why the question “give five things you hate about C#” is so difficult to answer
Porque é uma pergunta lista, e um mod mal fechava-a como "não construtiva" antes de ter a chance de respondê-la ...; PRespostas:
Se eu tivesse que adivinhar:
Alguns programadores não têm exposição diversificada ao idioma. É difícil ver as coisas erradas no idioma quando você não sabe que existem coisas melhores.
Alguns programadores são meros macacos de código. Eles mal analisam os problemas à sua frente, muito menos algo como a linguagem de programação deles poderia ser melhor.
Poucas pessoas são particularmente críticas. Eles vêem benefícios e recursos, não deficiências. É difícil para eles mudarem para esse modo de pensar se a entrevista não for assim.
Pelo menos por aqui, ser excessivamente crítico é visto como uma falha fatal da personalidade. Em vez de serem 'o desenvolvedor perspicaz que está sempre procurando maneiras melhores de fazer as coisas' (como algumas áreas em que vivi), eles são 'aquele idiota que odeia tudo'. Mesmo as pessoas que conseguem pensar nas coisas que odeiam no idioma podem adiar em um ambiente de entrevista parecer menos azedas.
fonte
Eu imaginaria que a pergunta é tão difícil de responder durante uma entrevista porque é:
Realmente inesperado,
Requer muito pensamento, e um pensamento de uma maneira muito diferente daquela usada durante uma entrevista,
É difícil responder em geral em um curto período de tempo (a menos que esteja preparado antes da entrevista).
1. É inesperado
Perguntas inesperadas são realmente difíceis, especialmente em um contexto estressante. Imagine a seguinte caixa de diálogo durante uma entrevista:
2. Requer muito pensamento diferente
Quando você faz perguntas gerais do tipo entrevista, você está usando sua memória para lembrar o que aprendeu nos livros ou na sua prática sobre o idioma e a estrutura. Você pode pensar um pouco para encontrar uma resposta, mas não muito.
Por outro lado, a pergunta sobre as cinco coisas que você odeia exige um pensamento mais profundo. Você não pode simplesmente se lembrar de algo que aprendeu nos livros e não consegue encontrar nada por analogia. Em vez de ser passivo, você precisa ser crítico e encontrar o que poderia ser desagradável no idioma que você usa.
3. Requer tempo
Francamente, tenho minha lista de cinco (na verdade mais) coisas que odeio no C #, mas pensei sobre isso por um longo período de tempo. Algumas coisas são da era do .NET Framework 2; a maioria dos problemas listados para o .NET Framework 2 não são mais válidos porque foram removidos, alguns com LINQ e todo esse material de programação funcional, outros com programação dinâmica. Não tenho certeza se, sem preparar esta pergunta, eu seria capaz de encontrar todos os cinco elementos durante uma entrevista.
fonte
Eu acho que é difícil por causa da palavra cinco . E, em menor grau, por causa da palavra ódio .
Cinco ? E se você só encontrar quatro? Você não respondeu à pergunta? E se você tiver mais de cinco? Agora, no local, você precisa descobrir quais são os cinco melhores para usar.
Ódio é uma palavra muito negativa. É o tipo de negatividade que as pessoas devem evitar nas entrevistas. Além disso, eu acho que soaria estranho para muita gente ter que muitas coisas que eles "ódio", sobre uma linguagem que vai passar toda a programação dia Algumas pessoas podem até pensar que é uma pergunta capciosa:. Se eles realmente não vêm com cinco coisas, eles serão desqualificados por odiar muito o C # para programar bem. Infelizmente, esse tipo de pergunta perversa e enganosa não é inédita nas entrevistas.
Em vez disso, você pode perguntar: O que você melhoraria em C # se dependesse de você? Isso permite que o entrevistado responda com inúmeras coisas. Essa frase também comercializa a negatividade da palavra "ódio" pelo relativamente positivo "melhorar".
fonte
Disposed
, mas na ausência de um requisito de que todas as linguagens imponham isso, pode-se argumentar que as linguagens que o fazem convidariam falsas expectativas. Portanto, pode não estar claro se a dificuldade de evitar vazamentos de recursos na falha do construtor C # deve ser atribuída ao C # ou ao CLS.A maioria dos candidatos não está tão profundamente envolvida com mais de um idioma ou paradigma para contrastar . Não trabalho com outra linguagem orientada a objetos há mais de cinco anos, e na qual eu estava trabalhando (PowerBuilder), tinha muitode irritações com. A maioria dos caras recém-saídos da faculdade são (ou pensam que são) coisas gostosas em um, talvez dois idiomas, e receberam "exposição" a mais três ou quatro (o que significa que eles concluíram pelo menos uma tarefa de casa que exige menos de um semestre inteiro curso estudando). Isso não é conhecimento ou experiência suficiente para realmente saber o que há de errado com o idioma. Consiga um emprego no mundo real, e esse foco diminui consideravelmente; você aprende muito mais sobre o idioma que recebe o salário do que qualquer outro e, no processo, aceita o que o idioma não faz ou faz de maneira estranha, a ponto de não se lembrar fazendo diferente.
A maioria dos candidatos salvos em C # que o comparam ao Java / C / C ++ estão muito felizes com isso . O C # foi desenvolvido desde o início para fazer muitas coisas melhores que o Java (eventos, retornos de chamada, biblioteca de gráficos, trabalho com banco de dados). O Java, por sua vez, foi projetado para ser mais fácil de usar e mais focado no código correto do que o C ++. Ainda não encontrei um programador de C # que queira voltar ao C ++ em qualquer ambiente em que o desempenho estressante e o controle no nível do circuito próximo não sejam necessidades essenciais.
Em outras palavras, o See-Sharpers o considera muito bom, considerando tudo.
Aqui está a minha lista:
Instruções Lambda não assistíveis / avaliáveis . As chamadas para métodos nomeados podem ser conectadas ao QuickWatch do VS. Assim como expressões. Mas lambdas? Não (pelo menos não no VS2010). Torna a depuração das cadeias Linq uma tarefa real.
Os valores opcionais dos parâmetros para tipos de referência diferentes de sequência podem ser nulos . se eu estivesse criando uma pilha de sobrecarga, convém usar outros padrões. Talvez eu consiga usar como padrão um valor com base em uma propriedade ou expressão simples com base em outro parâmetro. Mas eu não posso. Portanto, o valor de não ter que criar uma pilha de sobrecarga (que é menor com um assistente de refatoração como o ReSharper para manipular o padrão) é diminuído quando as opções para os parâmetros opcionais são tão drasticamente limitadas.
O C # está ficando velho o suficiente para ter sérios problemas de código legado . O código originalmente escrito para 1.1 faria com que qualquer pessoa acostumada ao 4.0 se encolhasse de horror. Até o código 2.0 perde muito. Ao mesmo tempo, chegaram bibliotecas de terceiros que fazem coisas como o ADO.NET parecerem lamentavelmente primitivas (e grande parte do "modelo conectado" do ADO.NET agora é um grande antipadrão). No entanto, para compatibilidade com versões anteriores, o .NET adota o suporte a todo esse código antigo e ruim, nunca ousando dizer algo como "ArrayList era uma maneira ruim de fazer isso, desculpe-nos por colocá-lo e estamos adotando use a Lista e, se você precisar absolutamente de uma lista de tipos diferentes, declare-a como
List<Object>
.Regras de instrução de switch seriamente limitadas . Provavelmente, uma das melhores coisas que eu poderia dizer sobre o PowerBuilder é que a instrução Choose Case (equivalente a switch) permitia expressões booleanas com base na variável. Ele também permitiu que as instruções do switch fossem aprovadas, mesmo que tivessem código. Entendo as razões pelas quais esse segundo não é permitido (é mais provável que seja feito sem intenção do que de propósito), mas ainda seria bom, de tempos em tempos, escrever uma declaração como:
fonte
Bag<Fruit> bag = Bag<Huckleberry>
significaria que você poderia fazer obag.add(new Watermelon())
que não podia aguentar.Thing<out T>
tenha um campo estático que seja acessado por um método de instância e um método estático. Se aThing<Cat>
é passado para um método que espera aeThing<Animal>
esse método chama a instância e os métodos estáticos mencionados acima naThing<Animal>
referência, quais campos estáticos esses métodos devem acessar?Eu sugeriria que parte do problema é o medo de dar uma resposta ruim - você diz que odeia X, o entrevistador ama X ou acha que sua razão de odiar X é idiota, dizendo que acha que tudo bem pode parecer a opção menos controversa.
Provavelmente também é algo sobre o qual a maioria das pessoas não pensou muito; eles têm problemas atuais e problemas passados, os problemas passados causados pelo idioma acabaram e, portanto, as pessoas pensam principalmente na solução e não no problema, pois isso era mais significativo, e poucas terão um problema atual causado pelo idioma.
fonte
Para uma entrevista, eu pediria apenas 1 ou 2, mas concordo que, se você não pode citar nenhuma limitação da ferramenta que usa, provavelmente não a conhece muito bem. Fazemos essa pergunta exata sobre o SSIS e isso realmente ajuda a separar o joio do trigo; todos que contratamos que responderam bem a essa pergunta se tornaram um ótimo funcionário. Precisamos de pessoas que adquiram conhecimento avançado e não de alguém que o tenha examinado algumas vezes. E aposto que é isso que você também quer.
Penso que é uma pergunta válida e o fato de tantos não terem conseguido responder é apenas um exemplo de quão pobres são muitos os candidatos a empregos. Se alguém não é analítico o suficiente para descobrir algumas limitações da ferramenta, como será analítico o suficiente para resolver problemas de programação difíceis?
fonte
Tudo se resume ao que você disse: falta de experiência profunda com C # e / ou falta de exposição a outros idiomas. Eu entrevistei vários desenvolvedores que se consideravam seniores e que não conseguiam responder a algumas perguntas que até um leve arranhão na superfície do C # deveria ter revelado a eles.
Sem escavação suficiente, você não alcançará os limites do idioma e desejará que eles se foram. Meus cinco melhores no caso de alguém estar se perguntando
fonte
Eu acho que em sua rodada sobre o jeito que ele está dizendo; se você acha que está quebrado, provavelmente não entende por que está como está. Pode haver um buraco no seu conhecimento.
Ironicamente, os entrevistadores que pensam estar citando "o grande Joel" usando isso como uma pergunta de entrevista provavelmente estão perdendo o objetivo.
fonte
Eles podem ficar relutantes em responder porque podem ter a impressão de que, se puderem listar 5 coisas que odeiam em um idioma, o entrevistador poderá se virar e dizer 'Ah, estamos procurando por ninjas em C #' e você não parece gostar do idioma "ou" Por que você se candidatou ao emprego se não gosta do idioma? ".
Os entrevistados estão sob muita pressão para permanecerem positivos durante as entrevistas.
fonte
Porque as línguas moldam a maneira como pensamos . Ao usar o C # todos os dias, você adota o hábito de pensar e projetar seu código de uma maneira que naturalmente contorna os problemas da linguagem.
Agora você faz isso sem pensar, sem nem mesmo saber que faz. É por isso que é tão difícil apontar quais são as coisas ruins. Sem dúvida, no dia em que começou a aprender C #, você encontrou muitos problemas, mas agora não os vê mais. Hábitos são coisas poderosas. Hábitos de pensamento, ainda mais .
O lado positivo disso é que, se você achar difícil listar as falhas no C #, deve ser porque você é um bom programador de C #, gosta do idioma e usa-o mais do que em outros idiomas.
Mas se você quiser se tornar mais capaz de ver as falhas no C #, precisará mudar sua maneira de pensar. Aprenda mais linguagens de programação e acostume-se a elas. Procure os mais diferentes idiomas possíveis. Você está acostumado a digitar estática? Tente Python ou Ruby. Você está acostumado a ser orientado a objetos e imperativo? Haskell é outro mundo inteiramente.
E quando você voltar ao C #, você será como: "Por que eu preciso de cem linhas de C # para fazer essa coisa simples que é apenas uma linha em Haskell?". Você vai odiar muitas coisas sobre c #.
(É claro que nenhum idioma pode ter tudo. O design do idioma é extremamente difícil e a adição de todos os recursos ao mesmo idioma não pode funcionar. Ferramentas diferentes para diferentes propósitos.)
Sim, é difícil responder bem à pergunta, principalmente durante uma entrevista. Mas as pessoas que podem responder provam que pensaram sobre isso, que têm alguma perspectiva.
fonte
(a, b) = this.something();
como em Python) é a primeira coisa que me vem à mente.