Por que a pergunta “dê cinco coisas que você odeia no C #” é tão difícil de responder durante uma entrevista? [fechadas]

32

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 paramsargumentos).
    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 readonlycampo 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 TryParseisso, 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.

Arseni Mourzenko
fonte
52
Why the question “give five things you hate about C#” is so difficult to answerPorque é uma pergunta lista, e um mod mal fechava-a como "não construtiva" antes de ter a chance de respondê-la ...; P
yannis
6
@ Yannis Rizos: bom ponto. BTW, ao digitar esta pergunta em um título, o Stack Overflow avisa que "A pergunta que você está fazendo parece subjetiva e provavelmente será encerrada".
Arseni Mourzenko
5
Talvez o espaço de armazenamento do seu cérebro para coisas odiosas sobre linguagens de programação seja principalmente preenchido com aspectos de outras linguagens com as quais você precisa lidar.
Whatsisname
9
Provavelmente porque a maioria das pessoas não é odiosa. Ódio é uma palavra bastante forte para a maioria das pessoas. A julgar pela lista de itens muito, muito triviais que você "odeia" em C #, cara, eu realmente não gostaria de estar em qualquer lugar perto de você quando há algum motivo para realmente odiar algo. Eu suspeito que sua cabeça explodiria. Eu também suspeito que criar uma lista é difícil para a maioria das pessoas, uma vez que você realmente se esforçou para elaborar sua lista e teve dias para pensar nela.
Dunk
19
Você notou como todos os itens da sua lista diziam respeito a algo que faltava e não a algo errado. Na minha opinião, você falhou na pergunta da entrevista. Todos podem listar recursos ausentes no idioma e declarar que é um motivo de ódio, mas o idioma mais odiado será o que possui todos os recursos.
Stilgar

Respostas:

42

Se eu tivesse que adivinhar:

  1. 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.

  2. 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.

  3. 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.

  4. 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.

Telastyn
fonte
22
Quanto ao no 2, preferimos Software Simians , senhor.
precisa saber é o seguinte
@ Tom Eu pensei que era pan programmatoribus .
Stefano Borini
9
@Telastyn não deveria haver cinco pontos de bala na sua resposta?
9137 Ben Jackson
Nº 4 é o que me veio à mente imediatamente, principalmente em ambientes de trabalho comprometidos com o uso de C #. Considerando-se uma entrevista comum e conselhos sobre comportamento no local de trabalho, ser questionado em uma entrevista de emprego pode parecer uma isca para capturar "más atitudes" que podem fazer com que não desejem contratar essa pessoa. Diferentemente da ação judicial, nas entrevistas de emprego é improvável que seja uma defesa eficaz. ;-)
Dronz 24/11
35

Eu imaginaria que a pergunta é tão difícil de responder durante uma entrevista porque é:

  1. Realmente inesperado,

  2. Requer muito pensamento, e um pensamento de uma maneira muito diferente daquela usada durante uma entrevista,

  3. É 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:

- Qual a diferença entre HashSet<T>e List<T>?
- O hashset é otimizado de forma que a busca por um elemento seja muito rápida. Por exemplo, se você estiver usando set.Contains()várias vezes um loop, mover a setlista de para o hashset pode tornar as coisas mais rápidas.
- Como você cria uma propriedade somente leitura?
- Uso um campo marcado como readonlycampo de apoio para uma propriedade que possui apenas um getter.
- Para que serve sealed?
- Você o usa para classes que não devem ser herdadas.
- Qual foi a última vez que você viu um dentista?
- O que?!

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.

Arseni Mourzenko
fonte
3
Eu acho que você geralmente está certo, mas programar em um determinado idioma por tempo suficiente simplesmente o fará odiar certas 'peculiaridades' dele. Como uma lista de hits de algum tipo. Ou pelo menos eu tenho um para cada idioma / plataforma que já usei. Ou talvez eu seja apenas mimada e exigente.
precisa saber é o seguinte
2
@ K.Steff: "Hit-list" é um nome perfeito para ele :). Certamente posso pensar em mais de cinco problemas, mesmo com minha plataforma favorita; se você me perguntar sobre uma linguagem que eu não gosto, mas fui forçada a usar (por exemplo, Java ou Python), eu provavelmente poderia continuar por horas: P.
Tikhon Jelvis
1
Se você consegue se lembrar facilmente daquilo que odeia em um idioma dependerá de quão problemáticas são as 'peculiaridades' em relação a outras coisas com as quais você precisa lidar. Por exemplo, a maior parte do meu trabalho envolve a interação com um determinado sistema externo (e particularmente terrível) e sua API. A maioria das queixas sobre C # /. NET empalidece em comparação e é empurrada para o fundo da minha mente.
Dan Lyons
É maravilhoso que você possa acompanhar uma "lista de hits" para cada idioma / plataforma e carregá-la com você enquanto programa em um determinado idioma por "tempo suficiente". Existem outros que simplesmente não se incomodam em levar esses problemas depois da programação por "tempo suficiente". O que os outros fazem é descobrir uma solução para os problemas em sua lista de ocorrências e nunca mais precisar se preocupar com o problema da lista de ocorrências, porque eles fizeram isso desaparecer. Se era problema o suficiente para carregar uma lista, então eles deviam ter pensado que era problema o suficiente para dedicar um tempo para resolver ao seu gosto.
Dunk
21

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".

Kyralessa
fonte
2
Seu argumento contra o "cinco" é bom - muitas pessoas provavelmente terão um continuum de coisas de que não gostam em graus variados, mas a única maneira de decidir quais coisas representam os cinco primeiros seria classificar tudo o que estiver próximo. Se alguém recentemente teve problemas com algo que geralmente é um pequeno aborrecimento, pode ser necessário pensar um pouco para descobrir se realmente deve ficar entre os cinco primeiros ou se apenas veio à mente por se tratar de um problema recentemente. Além disso, o C # está tão entrelaçado com o .NET que é difícil dizer o que culpar. Por exemplo ...
supercat 16/02
1
... Eu diria que todas as linguagens devem garantir que, se um construtor lançar, o objeto parcialmente construído receberá 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.
supercat 16/02
14
  • 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:

    switch(someInt)
    {
        case < 0: //all negative values enter here
           //...
           break;
        case 0: 
           //...
           break;
        case 1:
           //...
           //no break; continue through to the code for > 1
        case > 1 // all positive values enter here (including 1)
           //...
           break;
    }
    
  • Sem interface numérica . Se for um número, você pode fazer contas com ele. Em muitos casos, o método real não precisa se preocupar exatamente com quais tipos estão conectados; a precisão é de responsabilidade do chamador. No entanto, não é possível criar um método ou classe genérica que possa aceitar apenas tipos de número como o GTP.
KeithS
fonte
3
"A maioria dos candidatos salvos em C # que o comparam ao Java / C / C ++ estão muito felizes com isso". Esse foi o meu pensamento. Não há muito o que odiar no C #, pois ele permite que você se concentre na solução do problema de negócios e não na solução do problema técnico. A maior reclamação que tenho com a linguagem é que não posso usar cadeias de recursos em testes de caso de comutação porque são tecnicamente variáveis ​​e não constantes.
Stephen
4
A parte sobre genéricos e contêineres - exemplo útil com super e obscuridade com estende-se em genéricos? explica um pouco. Atribuir Bag<Fruit> bag = Bag<Huckleberry>significaria que você poderia fazer o bag.add(new Watermelon())que não podia aguentar.
4
+1 para o não numérico. Raro, mas irritante.
jmoreno
Suponha que 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 a Thing<Cat>é passado para um método que espera ae Thing<Animal>esse método chama a instância e os métodos estáticos mencionados acima na Thing<Animal>referência, quais campos estáticos esses métodos devem acessar?
Supercat
11

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.

jmoreno
fonte
7

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?

HLGEM
fonte
1
+1 Five é intimidador, por esse motivo 1 ou 2 provavelmente obteria mais respostas.
Laurent Couvidou
2
O ódio é muito diferente de uma limitação ......
mattnz
4

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

  1. Objetos imutáveis ​​requerem muita cerimônia para serem criados (em oposição a uma linguagem funcional em que os objetos são imutáveis ​​por padrão).
  2. Metaprogramação é difícil de fazer. Compare type emit às macros Lisp. (Serviços de compilador ajudarão muito com isso daqui para frente).
  3. Os métodos de extensão são ótimos ... as propriedades de extensão e os operadores de extensão (operadores especificamente implícitos e explícitos) seriam melhores.
  4. As conversões explícitas são resolvidas no tempo de compilação, em vez do tempo de execução.
  5. No Sequence Matching é muito mais limpo que a sobrecarga de funções.
Michael Brown
fonte
Concordo com seus dois primeiros pontos, mas estremeço com a ideia de uma conversão implícita de extensão.
CodesInChaos
3

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.

Ian
fonte
Eu diria que nem sempre é esse o caso. Por exemplo, Douglas Crockford diz em "JavaScript: The Good Parts" que você deve evitar certos recursos da linguagem, e não acho que ele queira dizer que eles são "muito rígidos" para usar.
precisa saber é o seguinte
10
Acho que ele está dizendo o contrário - se você acha que uma plataforma não está quebrada de maneira alguma, você não a conhece bem o suficiente. Ou seja, o argumento dele é que não há problema em aderir a uma única plataforma, desde que você não seja cego para suas deficiências.
Tikhon Jelvis
3

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.

James
fonte
se eu odeio algo em um idioma, isso não significa que eu odeio o idioma. Esta pergunta <del> can </del> também deve ser respondida de maneira positiva. Por que precisamos do HTML5 se não odiamos nada no HTML4? :)
e-MEE
3

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 #.

  • C # não possui tipos de referência não anuláveis.
  • Não há tipos de dados algébricos.
  • Sem interpolação de string.
  • A sintaxe é excessivamente detalhada em todos os lugares.
  • Nenhum sistema de macro.
  • A inferência de tipo é limitada.
  • Sem literais de regexp.
  • Sem tipagem estrutural.
  • Fraco apoio à imutabilidade.
  • Estruturas C # são propensas a erros.
  • A biblioteca de coleções padrão é muito limitada.
  • Não é possível definir restrições nos parâmetros dos construtores.
  • Não é possível programar genericamente com restrições nos operadores matemáticos.
  • Nenhum 'novo tipo'.
  • Sem divisão de matriz, sem intervalo literal.
  • As funções não listam os efeitos colaterais que eles podem fazer como parte de seu tipo. :)

(É 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.

Eldritch Conundrum
fonte
+1. Ponto excelente. De fato, muitas coisas que eu realmente odeio em C # vêm do fato de que outros idiomas não têm as mesmas desvantagens. A falta de tuplas reais (ou seja, impossibilidade de fazer (a, b) = this.something();como em Python) é a primeira coisa que me vem à mente.
Arseni Mourzenko