Armadilhas do mundo real da introdução de F # em uma grande base de código e equipe de engenharia [fechado]


37

Sou CTO de uma empresa de software com uma grande base de código existente (toda em C #) e uma equipe de engenharia considerável. Eu posso ver como certas partes do código seriam muito mais fáceis de escrever em F #, resultando em tempo de desenvolvimento mais rápido, menos bugs, implementações paralelas mais fáceis, etc., basicamente ganhos gerais de produtividade para minha equipe. No entanto, também vejo várias armadilhas de produtividade da introdução do F #, a saber:

1) Todo mundo precisa aprender F #, e não é tão trivial quanto mudar de, digamos, Java para C #. Os membros da equipe que não aprenderam F # não poderão trabalhar nas partes F # da base de código.

2) O conjunto de programadores F # contratáveis ​​a partir de agora (dez / 2010) é inexistente. Pesquise em vários engenheiros de software retomar bancos de dados para "F #", assim como menos de 1% dos currículos contêm a palavra-chave.

3) O apoio da comunidade a partir de agora (dezembro de 2010) está menos disponível. Você pode pesquisar no Google quase qualquer problema em C # e encontrar alguém que já tenha lidado com isso, não com F #. O suporte a ferramentas de terceiros (NUnit, Resharper etc.) também é superficial.

Percebo que isso é um pouco complicado, ou seja, se pessoas como eu não usam F #, a comunidade e as ferramentas nunca se materializam etc. Mas, eu tenho uma empresa para administrar, e posso ser de ponta, mas borda não sangrando.

Quaisquer outras armadilhas que eu não estou considerando? Ou alguém quer refutar as armadilhas que mencionei? Penso que esta é uma discussão importante e gostaria de ouvir seus contra-argumentos neste fórum público que podem fazer muito para aumentar a adoção de F # pela indústria.


7
"O pool de programadores F # contratáveis ​​é [...] inexistente" - Quase inexistente. No entanto, se você encontrar um programador que tenha ou esteja disposto a se especializar em F #, ele provavelmente será muito especial.
Tim Robinson

Você está pedindo armadilhas da vida real, mas está incluindo armadilhas potenciais em sua pergunta. Isso é convidativo para mais armadilhas "imaginárias" nas respostas ou para respostas fora do tópico que refutam as armadilhas que você está considerando. Se se downvote sua causa deste problema formulação se eu pudesse (reputação muito baixa)
Joh

Nick, eu diria: escolha alguns geeks seniores e capazes que você já tem e deixe-os jogar com o F # com o objetivo de tornar a empresa mais inteligente / melhor / mais produtiva, e não apenas por diversão. Existem alguns caras assim onde eu trabalho.
Job

Respostas:


28

A pesquisa é retomada para outras linguagens funcionais, como Scheme, Lisp ou Haskell. Muitas pessoas aprendem isso na escola e as têm em seus currículos; Tenho certeza que muitos deles não se importariam em aprender F #. Eu tenho o Scheme no meu currículo, embora nunca o tenha usado depois da escola e um trabalho envolvendo F # provavelmente também chamaria minha atenção.


13

Quaisquer outras armadilhas que eu não estou considerando?

Na prática, o principal erro que vejo as pessoas cometem é tentar forçar o uso de F # para problemas em que é a ferramenta errada para o trabalho.

Ou alguém quer refutar as armadilhas que mencionei?

Todas são obviamente preocupações válidas até certo ponto, mas eu questionaria até que ponto.

Por exemplo, você diz que todos teriam que aprender F # para trabalhar no código F #. Embora seja verdade, isso não é grande coisa na prática. Aprender F # não é mais significativo do que aprender WPF, Silverlight ou TPL. Estou ensinando a cerca de 30 desenvolvedores como usar o F # para um cliente em Londres no momento e cerca de uma dúzia estavam trabalhando em tempo integral no código F # após apenas algumas semanas e eles acabaram de lançar seu primeiro produto (dentro do prazo e do orçamento! ) escrito quase inteiramente em F # depois de apenas alguns meses. De fato, eles tiveram mais dificuldades técnicas com o Silverlight do que o F # e consideraram o suporte técnico do Silverlight muito pior do que o do F #.

Você se refere ao pool relativamente pequeno de programadores de F # disponíveis, mas, novamente, dado o quão fácil é pegar o F #, não acho que essa seja uma preocupação significativa. Duvido que você precise contratar muitos, se houver. Meu cliente tem dois funcionários do F # para mais de 100 programadores e nosso trabalho é propagar e supervisionar o uso do F #.

Sua terceira e última preocupação diz respeito a menos suporte da comunidade, pesquisar no Google soluções para C # versus F # e suporte a ferramentas de terceiros. Mais uma vez, não achei que isso seja problemático na prática. Enviei um e-mail para fsbugs com um comentário sobre unidades de medida em F # e recebi uma resposta em 24 horas do pesquisador que o inventou com uma explicação detalhada de por que minha interpretação estava errada e por que funciona da maneira que funciona. Eu nunca recebi isso de Anders Hejlsberg ;-). Eu procuro por soluções o tempo todo e as encontro escritas em C #, VB ou até IronPython, mas, em três anos de uso do setor de F #, consigo lembrar apenas uma única instância em que traduzir a solução em F # não era trivial. De fato, recentemente converti a amostra C # do serializador de dados do MSDN para F # e era 5 × mais curta. Por fim, você mencionou o suporte ao F # em ferramentas como o NUnit quando uso o NUnit do F # sem problemas há algum tempo. Essas são ferramentas .NET, não ferramentas C #.

Estudo de caso : Meu cliente atual não está apenas usando o NUnit para testes de unidade, mas eles criaram o TickSpec em F # sobre o NUnit como uma alternativa tecnicamente superior ao SpecFlow para BDD. O autor fez questão de me mostrar que o TickSpec é uma fração minúscula do tamanho do SpecFlow e oferece mais recursos. Além disso, vários desenvolvedores que trabalham com nenhuma experiência anterior em F # (e, acredito, nenhuma experiência anterior em programação funcional) o adquiriram e começaram a usá-lo em projetos não relacionados sem problemas, precisamente porque o F # + TickSpec facilita a solução de problemas. problemas

FWIW, dei ao meu cliente uma assinatura de site gratuita do nosso F # .NET Journal, que caiu bem com muitos dos desenvolvedores que aprendiam F #.

HTH!


3
Afirmação simples: um idioma que você pode aprender que rápido não vale a pena adicionar a um mix de desenvolvimento de negócios. O ponto em F # é escrever código funcional, e a maioria das pessoas não vai aprender programação funcional tão rápido.
David Thornley

8
Exemplo de contador plano: LINQ. Escrever código funcional não é absolutamente o ponto do F #, por qualquer definição de "funcional". No contexto dos desenvolvedores C # existentes, eles já devem estar no meio do caminho System.Func.
quer

11
Se o F # não é principalmente sobre programação funcional, o que é realmente isso? Como você sabe quando F # é mais adequado que, digamos, C #?
Robert Harvey

5
@ Robert: O F # oferece uma variedade de recursos que podem torná-lo muito mais produtivo que o C #. Tipos de variantes e correspondência de padrões são extremamente poderosos para criar e manipular árvores, que aparecem em tudo, desde compiladores a gráficos de computador. A inferência de tipo facilita a escrita de códigos altamente genéricos, ideais para algoritmos densos. As sessões interativas são ideais para código descartável, como massagear conjuntos de dados de um formulário para outro ou até fazer análises sofisticadas. Esses recursos estão relacionados incidentalmente à programação funcional e todos funcionam bem em códigos imperativos.
quer

8

Como você reconhece no seu primeiro ponto, seus programadores que não conhecem o F # não podem trabalhar na parte F # da sua base de código. No entanto, você não precisa reescrever toda a sua base de código em F # para obter vantagens com o uso - basta reescrever as partes em que você obteria o maior benefício. O fato de o F # interoperar muito bem com o C # deve tornar relativamente fácil esculpir determinadas peças e criar montagens F # a partir delas.

Se você tivesse seus engenheiros trabalhando em um aplicativo tradicional de três camadas, provavelmente não insistiria que todos precisassem ter um conhecimento profundo de SQL, HTML, Javascript, CSS etc. Em vez disso, naturalmente, alguns especialistas trabalhariam. em diferentes partes do aplicativo. Portanto, não acho que adicionar um novo idioma para uma parte do seu aplicativo seja um grande obstáculo. Além disso, você pode usar padrões de codificação e outras práticas para tentar garantir que seu código F # seja legível, mesmo por engenheiros sem um profundo conhecimento de F #.


11
@kvb, meu comentário é um pouco fora de tópico, mas só queria compartilhar isso, embora geralmente seja ideal, na prática muitas empresas não têm posições especializadas como você descreveu e exigem que, como no seu exemplo, um único desenvolvedor tenha profundo (suficiente) conhecimento de SQL, HTML, Javascript, CSS, etc. e talvez também análises de negócios. Eu pessoalmente trabalhei em ambos os cenários ( não determinados pelo tamanho da empresa) e cada um tem suas vantagens e desvantagens e pode ser mais ou menos apropriado em uma base por projeto, mas a especialização certamente é luxuosa.
Stephen Swensen

7

As armadilhas da adição de F # aos idiomas usados ​​incluem as armadilhas da introdução de qualquer nova tecnologia. Independentemente dos benefícios, se alguns de sua equipe não quiserem ou não forem flexíveis o suficiente para aprender, eles não poderão trabalhar em projetos de F #. No entanto, se você permitir que os dinossauros de sua equipe impeçam a adoção de novas tecnologias, sua empresa estará condenada.

As únicas armadilhas que experimentei pessoalmente são:

  1. Dificuldades ao depurar. Seguir o fluxo de execução de um programa baseado em expressão em um depurador projetado para linguagens baseadas em instruções pode ser complicado.

  2. Intellisense frustrante. A conclusão automática para de funcionar exatamente quando você precisa. A Microsoft deve trabalhar para tornar o analisador de segundo plano mais tolerante a falhas.

  3. A sintaxe sensível ao recuo torna difícil copiar e colar ou reformatar o código.

  4. Falta de refatoração.

  5. Algumas das convenientes extensões VS existentes para F # (dobra de código, coloração profunda) são um pouco lentas, tornando a experiência de digitação um pouco frustrante.

Na minha opinião, nenhuma dessas questões é um impeditivo, e eu posso viver com elas por enquanto. As ferramentas são mais fáceis de melhorar e corrigir do que os idiomas.

Seus medos de que contratar novos programadores capazes de escrever em F # seriam difíceis são bastante comuns, mas na minha opinião são injustificados. Se você escrevesse diretrizes de codificação, desaconselharia ou proibiria qualquer um dos seguintes recursos em C # yield return:, LINQ para objetos, lambdas, o próximo async?

Se você acredita que esses recursos ajudam a escrever um código melhor, não há motivo para não usar o F #. A linguagem suporta esses recursos de maneira suave e bem pensada, o que o C # não pode realmente fazer devido ao seu legado.

Se sua equipe é inteligente o suficiente para entender os conceitos por trás dos recursos que mencionei, eles têm tudo o que precisam para serem excelentes programadores em F #. O mesmo vale para futuros recrutas: você contrataria alguém incapaz ou pouco disposto a usar os recursos introduzidos após o C # 1.0?


5

Eu contemplei essa situação exata.

É isso que planejo para minha equipe:

  • Misture C # com F #, isso pode ser feito usando C # para a maioria da base de código. Onde for necessário processamento pesado de dados , escreva as funções associadas em F # e coloque-as em uma dll ou faça referência a elas. Exemplo aqui

  • Redefina lentamente sua base de código existente da maneira acima.

  • Nem todo o código precisa estar funcional.

  • Faça com que sua equipe aprenda o básico de Haskell, LISP nos fins de semana .

  • Faça com que eles aprendam F #, tentando resolver os quebra-cabeças do Projeto Euler (que me ajudaram muito quando eu estava aprendendo F #). Novamente, isso deve ser algo feito, digamos no final da semana ou durante o horário de trabalho, se você deseja reservar um dia para o "treinamento".


15
você vai pagar seus desenvolvedores para trabalhar nisso no fim de semana? Deus sabe que passei muitos fins de semana e noites aprendendo F #, mas como um hobby. Embora seja verdade que, quando fui escolhido para um projeto do Grails, eu me ensinei essa estrutura parcialmente durante o período de folga, mas essa é apenas a minha personalidade e eu gostei, mas se alguém me dissesse para fazê-lo durante o período de folga, eu faria não foi feliz.
Stephen Swensen

+1 mas: Haskell e Lisp são de interesse puramente acadêmico. Eu não acho que agregaria valor a um programador .NET para eles aprenderem essas línguas. Eu acho (como autor de vários livros em F # ;-) que ler um bom livro seria mais produtivo do que tentar escrever código F # (como os quebra-cabeças de Euler do projeto) no vácuo. Com orientação, eles podem ser atualizados em um mês.
Jon Harrop

4

1) O aprendizado de uma linguagem funcional aumentará a capacidade geral de alguém como programador; no entanto, isso se aplica apenas àqueles que desejam aprender e melhorar. Nem todo programador deseja melhorar, nem deseja mudanças no ambiente de trabalho (conheça sua equipe).

2) Não posso discutir com isso. Você terá que pagar pela curva de aprendizado de 6 meses de qualquer novo idioma, no entanto, já conhecendo as bibliotecas .net, elimina os anos extras necessários para aprender novas bibliotecas.

3) O suporte da comunidade, embora menor que C #, tem muitos desenvolvedores ativos de F # altamente qualificados postando na web. Não esqueça que a maior parte do suporte a idiomas é de biblioteca e há um ótimo suporte para o .NET.

O gorila de mil libras aqui é gerenciamento de riscos. "Eu posso ser de ponta, mas não de ponta." Eu diria que o F # não é uma vantagem. Foi lançado com o VS2010 e é diretamente suportado pela Microsoft. O sangramento é "beta" e um aviso da Microsoft dizendo algo sobre não ser responsável por nada.


Se alguém já conhece as plataformas C # e .Net, aprender F # geralmente custa menos de um mês. (com base na experiência dos meus dois colegas de trabalho.)

4

Por uma questão prática, o suporte ao IntelliSense é bastante escasso - a ponto de os ganhos de produtividade da inferência de tipo serem superados pelo preenchimento automático menos sofisticado disponível em C #.

As mensagens de erro causadas por inferências errôneas de tipo também demoram mais para serem corrigidas para iniciantes (e geralmente para usuários intermediários como eu), simplesmente porque você está menos inclinado a fornecer anotações de tipo do que em um idioma como C #.

OOP também está faltando de maneiras surpreendentes em F #; por exemplo, não há suporte para tipos / classes aninhados. Você precisa ter cuidado ao portar código, porque, infelizmente, há algumas coisas que você pode fazer em C # que não pode fazer em F #.

Por último, mas não menos importante, tanto o tamanho quanto a qualidade da comunidade F # são decepcionantes. Muitas informações do F # disponíveis na Web são para versões antigas ou simplesmente não são muito boas - não-idiomáticas, desempenho ruim ou incorretas. Depois, há pessoas cobrando muito dinheiro por boletins informativos, que são basicamente apenas um resumo das informações existentes.

Eu mesmo uso C # para projetos de trabalho e F # para minhas próprias coisas. Por mais que eu goste de F #, infelizmente, é um pouco difícil prever como / quando as coisas podem desmoronar.


11
Se £ 39 é "muito dinheiro" para treinar um desenvolvedor, aprender F # é a menor das suas preocupações, IMHO.
Jon Harrop

Ah, o próprio homem. Cara, você está em todo lugar, não é? Na verdade, £ 39 é muito dinheiro para o tipo de informação que hoje em dia é quase sempre disponibilizada em blogs ou documentos técnicos.
Rei Miyasaka

2
Todas as informações muito relevantes, não sei por que as pessoas estão fazendo voto negativo na sua postagem. Por mais que eu goste de F #, a questão tem a ver com seus lados negativos, e as postagens que apontam para isso não devem ser votadas negativamente pelos amantes de F #.
Joh

1

O principal problema é sempre a manutenção.

Eu adoraria codificar em Scheme, mas o próximo mantenedor provavelmente iria querer me caçar e me torturar.


E se o próximo mantenedor também conhecer o Scheme? Li no comp.lang.lisp que os programadores da Lisp trabalham em rede com o objetivo de fornecer substituições aos seus empregadores, se necessário.
Larry Coleman

0

Eu diria que a primeira coisa que você precisa fazer é perguntar aos membros da sua equipe como eles se sentem sobre a introdução do F #. Se eles gostarem da ideia, tudo ficará muito mais suave, se não gostarem.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.