Um profundo conhecimento de C ++ ajudará você a aprender outros idiomas mais rápido / mais fácil? [fechadas]

9

Existe a possibilidade de alguém que tenha aprendido todos os principais aspectos do C ++ e conheça muito bem os fundamentos da linguagem, aprendendo outras linguagens (como Python, Perl, Java) de maneira mais rápida e fácil?

eu..
fonte
9
Eu diria que o C ++ é diferente o suficiente da maioria das outras linguagens para torná-lo mais confuso ao buscar outra coisa (se é a única linguagem que você conhece). Muitas linguagens compartilham a sintaxe do C ++, mas poucas evoluíram na mesma direção. O C ++ possui muitos itens históricos específicos apenas ao C ++. Sua melhor aposta para aprender rapidamente novos idiomas é focar apenas no aprendizado de idiomas diferentes, de diferentes paradigmas. Quanto mais paradigmas você se familiarizar, mais rápido será para captar outras coisas desses paradigmas.
precisa saber é o seguinte
3
Eu não acho que conhecer C ++ lhe dê uma vantagem para aprender outras línguas em geral. Realmente depende de quais outros idiomas você aprenderá. Meu professor de linguagens de programação costumava dizer que devemos nos concentrar na compreensão de conceitos gerais: isso definitivamente tornará o aprendizado de linguagens individuais muito mais fácil.
Giorgio
9
Aprender um idioma em profundidade é um bom começo para aprender programação em geral, exceto que você pode confundir o conhecimento específico do idioma com o conhecimento geral. O C ++ moderno é uma ótima linguagem, mas uma vez que você tenha avançado para um nível intermediário, obterá grandes lucros ao conhecer outras perspectivas - talvez dê uma olhada no OCaml e no Ruby, mesmo que nunca as use seriamente. Quando você é um programador constante e consegue diferenciar coisas específicas de um idioma e geral, obter produtividade em novos idiomas é bastante fácil, embora o domínio sempre leve tempo.
amon
11
Comparado com o que? Aprendendo bem outra língua, conhecendo bem o C ++, mas não profundamente, sem saber nada?
Telastyn
2
Sim, mas também o contrário. Sabendo Ocaml ou Esquema faz um monte de C ++ 11 novos recursos mais fáceis de entender
Basile Starynkevitch

Respostas:

12

Em termos gerais

É provável que o conhecimento profundo de qualquer linguagem de programação o ajude a escolher outras linguagens mais rapidamente. Isso ocorre parcialmente porque a programação é uma maneira de pensar mais do que está aprendendo sintaxe. A maioria das práticas de programação se aplica à maioria das outras linguagens de programação. É por isso que as pessoas dizem que você sempre aprende a segunda linguagem de programação mais rapidamente que a primeira.

Em termos específicos

C ++ é uma linguagem que permite um 'controle' muito maior do que outras linguagens. Isto pode ser bom e ruim. Por exemplo, uma arma de verdade é melhor do que uma pistola de ar quando você vai para a floresta (porque você pode realmente derrubar algo com ela), mas também é mais perigoso para você e para as pessoas ao seu redor. O C ++ possui conceitos como gerenciamento de memória, com os quais você não precisa se preocupar na maioria das outras linguagens. Ter uma compreensão firme desses conceitos, no entanto, está longe de ser inútil, mesmo quando se trabalha com linguagens de gerenciamento automático de memória. Você também pode executar operações bit a bit e descer muito mais para o 'metal' com uma linguagem como C ++. Mesmo um entendimento básico nessas áreas pode ajudá-lo muito como programador em qualquer idioma.

Opinião pessoal

Eu pessoalmente aprendi Java primeiro por quase 3 anos antes de aprender C ++, e devo dizer que meio que me arrependo (curso uni ...). Isso tornou o aprendizado de C ++ (ainda estou aprendendo - longe de um conhecimento 'profundo': D) não tão simples quanto eu gostaria. Se eu tivesse feito o contrário, diria que teria sido muito mais fácil para mim. Especialmente quando você sabe PORQUE algo seja feito de uma maneira específica, e não apenas ter a certeza sobre a auto-magicness da língua. Se eu puder dar uma opinião, sugiro: C (para paradigmas de programação básicos e universais) -> C ++ (para entendimento básico de OOP junto com o gerenciamento de memória) -> Então você pode entrar em qualquer linguagem OOP 'real' com um boa base ou você pode continuar com tópicos mais avançados em C ++, tudo dependendo do que você

G.Rassovsky
fonte
3
Fico feliz que minha universidade tenha começado com pascal. Em seguida, progredimos para C (para a parte de gerenciamento de memória e operações de bits) e finalmente avançamos para java para oop (embora isso pudesse, obviamente, ter sido qualquer outra linguagem oo). Para ser sincero, acho bastante perturbador quantas universidades começam com java. Você vai, inevitavelmente aprender java (e mais importante, OOP) errado, desde OOP real é muito complicado para iniciantes que ainda estão lutando com a diferença entre OReAND
Lovis
2
@Doval: a coleta de lixo oferece a ilusão de não ter que se preocupar com o gerenciamento de memória. Veja com que frequência os programas de código gerenciado obtêm vazamentos de memória, porque algumas referências permaneceram válidas em um local inesperado (as coleções são um criminoso perene) para ver o quão ilusório isso é realmente.
Mason Wheeler
11
@Doval: tamanho errado, local, alinhamento: como exatamente alguém faz alguma dessas coisas em uma linguagem orientada a objetos quando o tamanho adequado é conhecido pelo compilador e o alocador lida com o posicionamento e o alinhamento? Libertação antecipada: é exatamente isso que o GC deve impedir, portanto, dizer que não é relevante para esta discussão é simplesmente verdade. Mas isso acontece com o custo de transformar toda alocação em um vazamento de memória. E não pisar nos dados de outros objetos é um problema de verificação de limites , não um problema de coleta de lixo.
Mason Wheeler
2
O C ++ exige muito aprendizado específico da implementação do C ++, mas nunca será usado fora do C ++ devido às infinitas peculiaridades, às bibliotecas e a vários sistemas. Na minha experiência, todo mundo que escreve C ++ basicamente concorda que todo o C ++ é mal escrito e cheio de peculiaridades e esquisitices que são principalmente específicas do C ++. Aprender o seu caminho nesse campo minado não ajudará em nada em outros idiomas quando a maioria dos idiomas não apresenta os problemas que o C ++ apresenta.
Jimmy Hoffa
2
@Doval: Sim, esse é o meu ponto: essas coisas são algoritmicamente indecidíveis no caso geral , e é por isso que precisam ser tratadas por uma pessoa inteligente, e não um algoritmo, para serem manipuladas corretamente. E dizer "não é um vazamento, é um programa ineficiente" é apenas uma quebra de cabelo semântica; para um observador externo, o comportamento do programa é igual ao de um programa que está vazando memória, especialmente no contexto de sistemas multitarefa em que a compressão de memória sob carga pode causar problemas graves.
Mason Wheeler
9

Infelizmente não. Na verdade, esse é um grande problema ao ensinar C ++ nas aulas de programação, especialmente no nível iniciante: você pode aprender princípios de programação ou a linguagem C ++, mas a linguagem C ++ tem muitas armadilhas e pequenas armadilhas para aprender as duas coisas de maneira eficaz. o escopo de uma aula de um semestre!

Muitas coisas foram testadas em C ++ e, eventualmente, tornaram-se idiomáticas na linguagem por pura inércia, que praticamente todas as outras línguas analisaram e rejeitaram porque se revelou um grande erro. Os principais são os modelos do C ++ e o modelo de objeto do C ++ (objetos como tipos de valor nunca são uma coisa boa, porque interrompe a substituição de Liskov e o próprio OOP.)

Portanto, se você obtiver um conhecimento profundo de C ++ primeiro e quiser aprender outras linguagens de programação, haverá muitas coisas prejudiciais e contraproducentes que você precisará desaprender para ser eficaz em outras linguagens de programação.

Mason Wheeler
fonte
4
Existem razões pelas quais Java e C # têm um sistema de modelos estritamente mais fraco, mas isso ocorre porque eles precisam de metadados completos sobre tudo. E eu estaria interessado em uma explicação de como objetos como valores quebram coisas. Especialmente considerando que há referências ...
Deduplicator
3
@Duplicador: Java e C # têm um sistema genérico completamente diferente , porque a experiência mostra que os modelos causam todo tipo de problemas sérios, muitos dos quais surgem porque o sistema de modelos não foi bem planejado em primeiro lugar. (Turing é concluído por acidente , para dar um exemplo óbvio!) E os objetos como valores quebram a substituição de Liskov porque se você tem uma classe Derived cujo pai é Base e substitui um método virtual na Base, e você o passa por padrão passando para uma função que pega uma Base e chama o método virtual, ela não invocará a versão Derivada.
Mason Wheeler
2
@MasonWheeler: Ah, você está se referindo a fatiar .
Fred Larson
2
@ FredLarson: Eu deveria ter adivinhado que um problema tão prevalecente e pernicioso teria um nome específico para ele. (E, sendo C ++, um nome bobo naquele Quando um programador fora do C ++ ouve mundo "fatiamento", é provável que ele pensar. Fatiamento série : P
Mason Wheeler
4
Embora eu concorde com muitas coisas que você escreveu, acho que você tem um ponto de vista muito tendencioso ;-) IMHO aprender C ++ não torna as pessoas mais idiotas.
Doc Brown
8

Não. Conhecer bem o C ++ tornará mais fácil o aprendizado de outras linguagens semelhantes ao C ++. Mas isso seria chato. Por que você gostaria de conhecer dois idiomas iguais? Isso não compra nada para você. (Observe que isso não é específico para C ++. Aplica-se a qualquer idioma. Compare com idiomas naturais: aprender italiano não facilitará o aprendizado de outros idiomas. Facilitará o aprendizado de espanhol, francês ou português e o aprendizado de três idiomas. um deles facilitará o aprendizado do quarto, mas mesmo o aprendizado de todas as línguas românicas não ajudará nem um pouco a aprender finlandês, chinês, hindi, hebraico, árabe, pashtu, grego etc.)

Linguagens de programação implementam paradigmas. Peter van Roy colecionou um pôster dos 34 principais paradigmas de programação .

Os paradigmas, por sua vez, são compostos de conceitos. Esse cartaz lista cerca de 18 conceitos.

Todos os paradigmas (ou pelo menos os do pôster) são compostos a partir desses conceitos. Todas as linguagens implementam um ou mais paradigmas compostos por esses conceitos. Portanto, se você aprender esses conceitos, (em algum sentido) aprenderá todas as linguagens de programação ao mesmo tempo.

É claro que ainda existem muitas peculiaridades específicas do idioma (sintaxe entre elas). Além disso, esse pôster ignora completamente a digitação e, é claro, há uma diferença significativa entre um sistema do tipo System F <: ω , um sistema do tipo Scala ou um sistema dinâmico do tipo pato, sem falar em um sistema do tipo dependente à Idris, Agda, Coq, Guru ou ATS.

Jörg W Mittag
fonte
Hindi , não hindu . Nada o ajudará a "aprender hindu", muito menos italiano ou C ++ ;-) +1.
PKG
Na verdade, aprender idiomas diferentes, embora realmente parecido, ainda amplia sua mente e, assim, ajuda um pouco para idiomas mais distantes.
dyesdyes
Eu teria que discordar da comparação com as linguagens naturais, pois o C ++ é uma linguagem de vários paradigmas, diferente das linguagens naturais. Além disso, aprendendo um recurso de linguagem em detalhes, você conheceria as decisões de design desse recurso e provavelmente entenderia os prós e contras de outras implementações. Por exemplo, tente aprender modelos c ++ em profundidade sem conhecer seus benefícios e desvantagens versus genéricos dinâmicos. Mesmo se você não tropeçar em qualquer menções de C # (difícil hoje em dia), u'd ainda saber o que os genéricos dinâmicos são e saber instantaneamente limitações C # genéricos quando aprender sobre eles depois
Rado
5

Eu diria que conhecer profundamente qualquer linguagem de programação ajudará a aprender outras pessoas, pelo menos outras línguas da mesma família. Por exemplo, o conhecimento de C ++ não ajudará muito com LISP ou Haskell, mas para linguagens procedurais orientadas a objetos, ajudará. Minha abordagem foi tentar aprender um idioma de cada uma das famílias diferentes (procedimental, funcional, orientada a objetos etc.) de idiomas, para que o conhecimento possa transitar para outros idiomas da família. Por outro lado, um profundo conhecimento da APL não ajudará em nada mais ...

Jim Nutt
fonte
3
Eu já vi como é o código Self, Smalltalk ou Ruby, escrito por alguém que aprendeu C ++ como primeira língua. Na verdade, eu diria que conhecer C ++ é prejudicial ao aprendizado de OO. Eu acho que o Self ou o Newspeak seriam muito mais adequados para isso. BTW, um profundo conhecimento de APL ajudará pelo menos em linguagens como J e K. Também ajudará a pensar em abstrações de coleção de nível superior e liftig, o que provavelmente ajudará na programação no estilo MapReduce ou Hadoop, além de pensar em Functors , Candidatos, mônadas e categorias.
Jörg W Mittag
11
@ JörgWMittag: É sabido que se pode escrever COBOL em qualquer idioma ... qual é o objetivo?
Deduplicator
@Duplicador Se o seu primeiro idioma for COBOL, é muito mais provável que você escreva COBOL em outros idiomas.
Doval
Na verdade, tenho que concordar com a coisa do COBOL. Eu tinha um cara trabalhando para mim anos atrás, que escreveu COBOL em Pascal ...
Jim Nutt
5

Vou tomar uma interpretação diferente aqui.

C ++ é uma boa linguagem para aprender sobre estruturas de memória e dados, pois obriga você a pensar cuidadosamente sobre conceitos como propriedade de objetos e tempo de vida. E aprender sobre estruturas de memória e dados é uma das partes essenciais de qualquer currículo de engenharia de software.

Mas você precisa aprender sobre estruturas de dados. Se você apenas "aprender C ++", não ganhará muito, e isso pode atrasar o processo de aprendizado de outros idiomas no curto prazo.

Quando eu estava na faculdade, o Data Structures era um curso obrigatório para iniciantes, realizado após o CS1 (do qual pelo menos metade da turma havia saído). Foi difícil. O formato do curso foi basicamente "Aqui está uma estrutura de dados que você nunca viu antes [por exemplo, uma pilha esquerdista ]. Implemente-a em C ++ em uma semana e faça com que sua saída corresponda exatamente à nossa saída esperada, byte por byte, para que pode classificá-lo automaticamente. " Na próxima semana, você obteria uma nova estrutura de dados e uma nova atribuição. Provavelmente aprendi mais nesse curso do que em todos os outros cursos combinados.

Esse é o tipo de aprendizado que você precisa fazer para que o C ++ seja valioso.

Kevin
fonte
2

Cada idioma que você aprende torna o próximo mais fácil de aprender, especialmente dentro do mesmo paradigma. Eles tomam emprestado um do outro pesadamente, e depois de um tempo você chega ao ponto em que um novo idioma se parece apenas com uma coleção de recursos de outros idiomas, com algumas reviravoltas únicas.

Não acho que o C ++ seja melhor ou pior do que qualquer outra linguagem a esse respeito. É um dos idiomas mais detalhados que conheço e dificulta algumas coisas fáceis na maioria dos outros idiomas, mas que não se traduz necessariamente em tornar o próximo idioma mais fácil de aprender . No entanto, geralmente torna o próximo idioma mais fácil de usar . Há uma diferença.

Karl Bielefeldt
fonte
0

Não. Um conhecimento profundo de C , ou do subconjunto de C ++ que é "basicamente C", ajudará ao aprender outras linguagens, pelo menos ao imaginar o que suas implementações devem estar fazendo. Um profundo conhecimento de C ++ , por outro lado, será principalmente informações confusas ou irrelevantes ao aprender outras línguas; se você aprender a orientação a objetos do C ++ em mais do que um nível de superfície, por exemplo, ao passar para Perl / Python / Ruby, gastará mais tempo desaprendendo o que sabe do que usá-lo, já que os objetos nessas linguagens são implementados em uma maneira completamente diferentedo que em C ++. O mesmo se aplica em maior ou menor grau à maioria das outras linguagens e aos outros recursos de linguagem (por exemplo, modelos C ++ e polimorfismo Haskell são basicamente o mesmo recurso, com, novamente, implementações completamente diferentes). Portanto, o conhecimento profundo de C ++ será específico de C ++.

Jonathan Cast
fonte
é difícil ler este post (parede de texto). Você se importaria de editá -lo em uma forma melhor?
Gnat