Aprender a usar C (ou C ++) é um requisito para ser um bom (excelente) programador? [fechadas]

25

Quando comecei a aprender a programar, programadores de verdade podiam escrever montagens enquanto dormiam. Qualquer escolaridade séria em ciência da computação incluiria uma quantidade considerável de treinamento e prática em programação usando montagem. Desde então, isso mudou, a ponto de eu ver os cursos de Ciência da Computação com montagem, se incluídos, serem relegados a uma tarefa e um capítulo, para um total de duas semanas de trabalho em quatro anos de escolaridade.

A programação C / C ++ parece ter seguido um caminho semelhante. Não me surpreendo mais em entrevistar graduados da universidade que não passaram mais de duas semanas programando em C ++ e só leram sobre C em um livro em algum lugar. Embora os graus mais sérios de CS ainda pareçam incluir um tempo significativo de aprendizado e uso de um ou de ambos os idiomas, a tendência é claramente em direção ao C / C ++ menos aplicado na escola.

É claramente possível fazer uma carreira produzindo um bom trabalho sem nunca ler ou escrever uma única linha de código C ou C ++.

Dado tudo isso, vale a pena aprender as duas línguas? Eles são obrigados a se destacar? (além do conselho óbvio e não específico do idioma, como "uma boa seleção de idiomas é provavelmente importante para uma educação abrangente" e "é provavelmente uma boa ideia continuar tentando e aprender novos idiomas ao longo da carreira de programadores, apenas esticar as células cinzentas ")

blueberryfields
fonte
8
C é onipresente na infraestrutura de software atual. Aprender definitivamente proporcionará uma compreensão mais profunda do que realmente está acontecendo no software que você escreve. (Consulte programmers.stackexchange.com/questions/14744/… ).
Charles Salvia
Eu também achei as respostas aqui relevantes: programmers.stackexchange.com/questions/29109/...
blueberryfields
Tangencial: um bom programador se sente confortável com vários paradigmas de programação, isto significa ter aprendido (e usado) várias linguagens.
Matthieu M.
Aprender mais idiomas não pode doer.
Maxpm
4
Não há C / C ++. Existem apenas C e C ++. Eles são idiomas muito diferentes, e a resposta provavelmente será bem diferente, dependendo do que você está falando.
Caleb

Respostas:

63

Joel Spolsky (sim, isso Joel) argumentou há algum tempo que os programadores realmente difíceis sabem como usar linguagens mais difíceis (como C, C ++ e Lisp) e suas construções (como ponteiros e recursos funcionais), e que linguagens de nível superior geralmente não eram 'difícil' o suficiente para demonstrar sua competência.

Eu posso entender o argumento dele de que as pessoas que conhecem C e C ++ e que são realmente boas sabem muito mais sobre o que se passa sob o capô do que as pessoas que, digamos, programam em Ruby (e somente em Ruby). Eu diria que é assim: se você conhece uma linguagem "difícil", é provavelmente uma boa prova de que você é capaz de programar respeitando severas restrições ou que domina maneiras complexas de pensar. Se você é bom em um idioma de alto nível, é possível programar respeitando restrições severas, mas não há provas disso.

Eu não acho que aprender C ou C ++ danifique seu cérebro (algumas pessoas parecem acreditar nisso). Na verdade, aprender isso apenas para apreciar melhores idiomas de nível superior pode ser uma boa ideia.

zneak
fonte
34

Sim, é necessário conhecer C (ou C ++) para ser um excelente programador (atualmente).

Não é a própria linguagem, é o meio ambiente.

Os programas não são executados no vácuo. Um excelente programador conhece seu ambiente, como um grande escultor conhece seu material. Nosso ambiente de programação atual (sistemas operacionais, compiladores, redes, etc.) é construído em C / C ++.

Um excelente programador grava programas eficientes e os depura em situações da vida real. Ele deve conhecer o meio ambiente - e hoje em dia é necessário conhecer C / C ++.

Edit: Não resisto a adicionar a referência Matrix. Morfeu pode perguntar: você quer tomar a pílula Java e continuar vivendo em um mundo confortável fornecido pela máquina virtual? Ou você toma a pílula C e vê a profundidade da toca do coelho?

Maglob
fonte
9
+1 para a referência Matrix, eu vou mantê-lo para possível uso futuro :-)
Konamiman
20

Devo me referir a outro artigo de Joel. Em The Law of Leaky Abstractions , o aprendizado de linguagens como C, Lisp, C ++ e linguagens que envolvem gerenciamento de memória também envolve o aprendizado de uma maneira de pensar que nos define para o resto de nossas carreiras.

Meu professor na classe Estruturas de dados e algoritmos, William Spears, disse a uma sala cheia de estudantes céticos de Ciência da Computação por que não estávamos aprendendo as ferramentas mais recentes. Os alunos reclamaram que sentiam que não estavam sendo preparados para o "mundo real" porque não estávamos aprendendo Java. Não estávamos aprendendo JavaScript. Não havia aulas em HTML. Não estávamos aprendendo [[INSIRA A TECNOLOGIA AQUI]].

Por que não aprendemos as ferramentas mais recentes? Segundo nosso professor, a tecnologia muda tão rapidamente que, em 4 anos, as ferramentas que aprendemos podem muito bem estar obsoletas. Bem, depois de alguns anos na indústria, devo dizer que concordo com a avaliação dele.

O objetivo de uma educação em Ciência da Computação é aprender a aprender. Descobrir soluções para muitos problemas no desenvolvimento, muitas vezes, requer uma capacidade de pensar fora da caixa, que só pode vir do aprendizado básico, fundamental, básico, básico da Ciência da Computação, resultante do trabalho com C, C ++ e Lisp.

Quando essas abstrações no mundo real vazam, e elas ocorrerão, é o entendimento do básico que separa a média da melhor.

jmort253
fonte
3
Eu devo estar esquecendo alguma coisa. O que Lisp tem a ver com os fundamentos da aprendizagem? É a maior inversão de abstração já inventada. Um de seus objetivos fundamentais de design originais era "vamos fingir que não estamos realmente em uma máquina de Turing e ver o quanto podemos simplificar as coisas fazendo isso".
Mason Wheeler
6
@Mason: Aprender o Lisp não ensinará quase nada sobre computadores do mundo real. Isso ensinará muito sobre a teoria da computação. A ciência da computação bruta é mais do que computadores brutos.
David Thornley
2
@Mason Wheeler Aprendizagem lisp apresenta vários conceitos avançados, incluindo: dados / código são intercambiáveis, / código de auto-modificando reflexão, e a importância de considerar o seu compilador / vm uma parte do seu produto final
blueberryfields
@blueberryfields: ... todos os quais são considerados vulnerabilidades prejudiciais e / ou de segurança em um grau ou outro por codificadores mais experientes. Coisas muito ruins para ensinar aos novatos.
Mason Wheeler
2
@Mason Eu não entendo o contexto do seu comentário - estamos falando de excelentes programadores aqui, não novatos. Eu não consideraria um programador, que não possui um entendimento completo desses conceitos, e os aplicaria de forma adequada (e regularmente) em seu trabalho, como um especialista.
blueberryfields
18

Deixe-me colocar deste jeito. Digamos que você precisou contratar alguém para fazer algum trabalho em C ++, e alguém se aplica a quem fez um projeto em C ++ na faculdade, mas só programa em Java desde a graduação. Por outro lado, digamos que você precisava contratar alguém para trabalhar em Java, e alguém se aplica a quem fez um projeto em Java na faculdade, mas que só programou em C ++ desde a graduação.

Quem você vai se sentir mais confortável em contratar? Eu diria o cara do C ++, já que mudar para usar uma linguagem de coleta de lixo é muito mais fácil do que se afastar de uma. O mesmo vale para outros conceitos e outras linguagens, como passar de compilado para interpretado ou de estático para dinâmico. Em quase todos os recursos por comparação de recursos que você pode fazer entre linguagens, o C ++ é difícil, o que dificulta a programação, mas também uma excelente linha de base para julgar um programador.

Você pode prosperar em uma carreira sem nunca tocar no código C ou C ++? Claro, mas eu ainda não gostaria de contratar alguém incapaz ou com medo de fazê-lo.

Karl Bielefeldt
fonte
3
Argumento inexpressivo. Se eu precisasse do trabalho em Java, contrataria alguém com experiência em Java. Se eu precisasse do trabalho em C ++, contrataria alguém com experiência em C ++. Se eu tivesse que contratar um cara Java para uma posição em C ++, poderia dedicar algum tempo extra à entrevista perguntando a ele sobre ponteiros, gerenciamento de memória e RAII; Da mesma forma, se eu tivesse que contratar um profissional de C ++ para uma posição Java, passaria mais tempo na entrevista perguntando sobre nervosismo, padrões de design, reflexão etc. Nenhum dos conjuntos de habilidades parece exigir mais inteligência, apenas experiência. A maior parte da curva de aprendizado está nas bibliotecas de qualquer maneira.
Aaronaught
13

Não, não é necessário aprender C ou C ++ para ser um bom programador, mas entendê-lo ajudaria a esclarecer alguns conceitos básicos, como Gerenciamento de Memória.

Rachel
fonte
7

aprender as duas línguas vale o esforço?

É claramente possível fazer uma carreira produzindo um bom trabalho sem nunca ler ou escrever uma única linha de código C ou C ++.

S.Lott
fonte
6

Em suma, não, eles não são. São linguagens úteis para aprender, mas você pode facilmente ser um excelente programador sem tocar em uma linha de C ou C ++. A maioria dos excelentes programadores provavelmente os tocou, mas isso está além do ponto - em muitos aplicativos hoje em dia eles não são usados ​​tanto quanto .NET e Java e, portanto, sua necessidade caiu um pouco.

Note que não estou dizendo que eles não valem a pena aprender, acho que são as duas linguagens importantes para aprender, especialmente se você planeja fazer uma carreira fora da programação. Mas você pode ser um programador decente sem nunca ter tocado? Certo.

berry120
fonte
5

Depende dos seus interesses.
Se você deseja estar na programação do sistema, sim, precisará aprender C / C ++, pois elas são linguagens padrão do CS. Para se familiarizar com os conceitos do sistema operacional, compiladores, estruturas de dados, gerenciamento de memória etc., você deve conhecer C / C ++. Além disso, há toneladas de bons textos, livros e artigos em C / C ++, que otimizarão suas habilidades de programação. Poucos dias atrás, em / * Programadores * /, li uma excelente resposta para Por que C - porque é próximo ao metal .
Por outro lado, se você quiser se limitar à programação de aplicativos, não há necessidade de usar o C / C ++. Inicie diretamente com C # (.Net) / Java e você obterá um bom trabalho de desenvolvedor. Mas se você realmente gosta de programação hardcore, tenho certeza que um dia você começará a aprender C / C ++.

guarda
fonte
Perto de metal! Ame esse comentário.
Wajih
3

Depende totalmente do domínio do aplicativo em que você deseja trabalhar. Se você quiser jogar no cenário incorporado, precisará conhecer C ou C ++. C ++ também é provavelmente a linguagem mais usada no desenvolvimento de jogos. Se você quiser trabalhar em aplicativos da Web, C ou C ++ pode não ser tão importante. Não existe uma linguagem que tenha o prestígio de ser exigida como uma precedência para definir um bom engenheiro de software.

Pemdas
fonte
3

C foi nomeado "portably assembly", o que é muito verdadeiro. Ele foi projetado para tornar o Unix portátil entre os processadores e descrever o código muito próximo ao conjunto de instruções do processador subjacente.

Se você acha que gostaria de trabalhar próximo ao hardware real, seja em software embarcado ou drivers de dispositivo, etc., não há como contornar C. Se você deseja trabalhar nos idiomas mais comuns, de alto nível é uma idéia melhor, pois muitos dos recursos que tornam o C poderoso também estão tornando o C perigoso, para que sejam reduzidos ou simplesmente removidos.

Pessoalmente, consideraria muito importante entender o que eventualmente será necessário para executar seus programas, já que muitas decisões de design dependem disso, portanto você deve pelo menos estar familiarizado com como mapear o código no conjunto de instruções de montagem e como ele funciona no real hardware. Que as coisas que você considera verdadeiras levam tempo para fazer e por quê.

Portanto, eu pelo menos sugiro que você dê uma olhada em C e algum código aritmético avançado de ponteiro, para que você saiba com o que não precisa lidar diariamente.

user1249
fonte
1

C é útil para aprender porque é próximo ao silício. A linguagem C ou assembly fornecerá uma boa idéia do que os computadores podem fazer e como eles fazem, e isso provavelmente será útil para entender o que é possível e o que é prático. Além disso, há um monte de código C por aí que você pode estar interessado, e uma linguagem muito mais moderna usa grande parte de sua sintaxe e semântica.

C ++ é uma linguagem de nível superior que possui alguns recursos muito interessantes. Tem muitos bons usos e é uma linguagem poderosa. Por outro lado, existem muitas outras linguagens poderosas e úteis por aí.

Portanto, recomendo fortemente que você aprenda sobre o que acontece nos níveis mais baixos, e C é uma excelente maneira de aprendê-los; portanto, recomendo fortemente que aprenda C. O C ++ é opcional; aprendê-lo ensinará coisas, mas há outras maneiras de aprender a maioria delas, e se você já estiver trabalhando em um idioma convencional, há idiomas melhores para aprender a aprender novos conceitos.

David Thornley
fonte
0

Depende do tipo de software que você pensa que estará criando. Os jogos geralmente são escritos em C / C ++, pois é classicamente uma linguagem mais otimizada quando se trata do código executável. O que você codifica é exatamente o que você recebe, de certa forma.

Dito isto, o C # também foi usado para programar jogos. C # é provavelmente um dos os melhores linguagens para desenvolvimento de aplicações desktop, pelo menos na plataforma Windows.

Juntamente com o Visual Studio, o C # se tornou quase a única linguagem de desenvolvimento de software que eu uso (desculpando linguagens como SQL e PHP etc.), pois é para todos os efeitos, fantástica na minha opinião.

Se você desenvolver no Windows, recomendo fortemente que você aprenda C # .NET junto com qualquer outra coisa.

Porém, não acredito que o C ++ seja um requisito em si, mas é bom ter esse conhecimento de ponteiros, gerenciamento de memória e outros conceitos de nível inferior.

Nick Bedford
fonte
1
@ Nick: O mundo dos computadores está além das janelas e do C #.
Ranger
2
Daí porque eu disse: "Se você desenvolve no Windows" .
Nick Bedford
0

@Nick Bedford está certo sobre o domínio em que você está trabalhando. Meus colegas de software escrevem drivers de dispositivo e software incorporado. C é o caminho a percorrer. E não pense em C ++ como uma segunda linguagem, eles têm uma enorme sobreposição.

Brian Carlton
fonte
3
Se você não considera o C ++ como uma linguagem diferente do C ++, realmente não o conhece bem. Trabalhar apenas na sobreposição é possível, mas não aconselhável.
David Thornley
Talvez eu exagere na semelhança. Mas eles são mais os mesmos que, por exemplo, C e Perl.
Brian Carlton
0

Muitos disseram que C é bom para aprender sobre gerenciamento de memória e eu concordo. Para minha opinião sobre o aprendizado de C, é muito bom aprender a aprender como depurar um programa. Muita coisa pode dar errado ao escrever para C, exigindo que você pense sobre como deve depurar seus programas. Eu raramente uso uma ferramenta de depuração em qualquer uma das minhas programações (em C ou em outros idiomas) simplesmente porque C me ensinou como adicionar utilitários de depuração incorporados aos programas.

É necessário aprender C / C ++ para uma carreira? Não, mas também vi muitos desenvolvedores de Java que não conhecem muitos conceitos básicos de programação porque só aprenderam Java. Mesmo com programadores Perl. Aprender mais de um idioma deve ser um requisito para uma carreira, independentemente de o C / C ++ ser um desses idiomas.

Arcege
fonte
+1 - Ver conceitos semelhantes apresentados de uma maneira diferente em diferentes idiomas me ajudou a entender melhor esses conceitos e vê-los sob uma nova luz.
jmort253
0

No começo, eu pensava que minha universidade estava na geração de Dennis M. Ritchie por incluir C por 2 semestres, quando há muitas linguagens relativamente novas, como Java, Visual Basic etc. Mas o fato é, ou pelo menos agora acredito, C é uma das melhores linguagens que ajudam a entender os conceitos fundamentais de programação.

E sobre a carreira sem aprender C (ou C ++) - Sim, é possível, mas aprender C mostrará seu conhecimento em programação.

Mr Programmer
fonte
0

A resposta para mim foi sim. Ambos, C e C ++, eram cursos obrigatórios no meu programa de graduação em CS, e acredito que ter um diploma em CS ou um diploma relacionado é um requisito mínimo para ser um "bom programador". Além disso, ser um "bom programador" significa ser capaz de racionalizar os problemas que ocorrem e entender por que algo não funciona como se poderia esperar. Muitas vezes na minha carreira eu testemunhei indivíduos sendo surpreendidos por problemas e pensando que havia forças sobrenaturais trabalhando contra eles ... isso é ridículo.

Na IMO, conhecer C demonstra a capacidade de entender qualquer uma das linguagens imperativas e resolver problemas usando uma das ferramentas mais poderosas já inventadas pela humanidade.

sesteel
fonte
0

Um programador bem arredondado tem vários sacos de truques na manga, e incluem:

1) Programação de baixo nível ... C no mínimo. Alguma assembléia não faria mal.

2) Programação funcional ... Uma linguagem funcional pura, não um híbrido - o esquema funciona aqui.

3) OOP ... Normalmente eu diria smalltalk, mas acho que poderíamos usar o Java agora.

sujeira vermelha
fonte
0

C é a mãe de toda a linguagem de programação .... o conhecimento especializado em C faz com que você percorra um longo caminho para conhecer qualquer outra linguagem como Java em uma curta duração.

C ++ é um jogo totalmente diferente e é o mais complexo entre todos.

bhasinusc
fonte
0

Não é necessário aprender C ou C ++ para ser um bom (excelente) programador, no entanto, é necessário aprender uma montagem para ser um bom (excelente) programador. Uma programação excelente significa otimizar a memória, Mhz, largura de banda, restrições de energia e, em seguida, escolher o melhor design e / ou implementação para realizar a tarefa em questão. Entre os cientistas da computação, a principal fraqueza ainda é, após décadas de tecnologias em evolução, gerenciar os dados de maneira ideal. Este é um conjunto de habilidades ensinadas ao escrever Assembly (qualquer assembly; pode ser ARM, ou MIPS, ou x86, ou um microcontrolador, ou um DSP, ou até mais baixo que isso, via verilog / VHDL).

Jonathan Cline IEEE
fonte
0

Tendo usado c, c ++, assembly e Lisp com proficiência, eu diria que não faz sentido ter que aprender alguma linguagem específica para ser um bom programador. Minhas experiências com o que faz um bom programador são capazes de pensar de uma maneira que resolva problemas. Os idiomas permitem que você expresse suas habilidades de resolução de problemas. Por exemplo, a simplicidade de C permite expressar facilmente algoritmos, enquanto o Lisp permite resolver problemas recursivamente. Portanto, uma linguagem não faz de você um programador. Você precisa resolver o problema primeiro antes de se tornar um bom programador. Os idiomas são apenas ferramentas usadas para resolver problemas.

annoying_squid
fonte
-1

Vale a pena aprender C bem simplesmente para obter uma sólida compreensão do gerenciamento de memória. O mesmo vale para C ++, exceto com o objetivo de aprender estruturas de dados.

aqua
fonte
Não importa qual idioma se usa para aprender estruturas de dados.
Kirk.burleson
Acredito que sim, porque em muitas outras linguagens as estruturas de dados são usadas sem saber como elas são tratadas na memória. O C ++ (sem o uso de STL) força o programador a aprender como as estruturas de dados são tratadas no nível baixo.
água
-1

Não. Existem muitos programadores ruins que escrevem código C / C ++. O que fará de você um bom programador é entender quando e por que você precisaria escrever algo em C / C ++

Don
fonte