Por que o CS é ensinado a ser memorizado? [fechadas]

23

Tenho estudado Advanced Placement Computer Science no último ano no ensino médio. Parece que somos ensinados simplesmente a memorizar códigos e funções e não como ser engenhoso e eficiente no uso de documentação e afins.

Na prática, imagino que muitos (se não todos) trabalhos de programação permitiriam que você folheasse a documentação, revisasse o código passado e o código de outras pessoas, essencialmente fazendo o que meu professor consideraria "trapaça".

Embora eu concorde que os conceitos básicos sejam essenciais para memorizar (em qualquer assunto), me parece supérfluo e impraticável fazer um exame com caneta e papel para uma aula de ciências, especialmente quando praticamente você teria um compilador, depurador, referência manuais e toda a Internet a que se refere em qualquer situação de trabalho do mundo real.

Por que o ensino de CS é focado na memorização de código e funções, em vez de ensinar habilidades úteis, incluindo como usar e interpretar documentação, código de exemplo, depurador e outros?

esqew
fonte
34
CS não é sobre memorização de código e funções. Onde diabos você está estudando CS? Posso sugerir que o verdadeiro problema é que o curso que você está tomando é péssimo?
Andres F.
1
@AndresF. O OP está em Advanced Placement Computer Science, que é um curso oferecido para estudantes do ensino médio (antes da universidade).
3
@GlennNelson Oops! Eu interpretei isso errado. Ok, nesse caso: esqew : você ficará aliviado ao saber que, no nível universitário, o CS não é (principalmente) sobre memorização de código. Você vai ter que ler um monte de coisas, embora;) Educação A CS também não é necessariamente sobre encontrar um trabalho (você provavelmente vai ficar desapontado se você pensa que é)
Andres F.
1
Você deve saber que não é assim na maioria das faculdades. Na minha escola, todos os testes de ciência da computação foram anotações / livros abertos.
Casey Patton
2
Observe que parte da resposta provavelmente é que o CS não é um grau de programação . Não espere aprender a programar em uma aula de informática. Espere aprender todos os tipos de teoria e conceitos subjacentes que por acaso são relevantes para um programador. E, com certeza, você aprenderá algumas linguagens de programação e aprenderá um pouco de programação básica, mas principalmente, a programação real é algo que eles assumem que você obterá para que você possa se concentrar em todas as coisas do CS , e não o contrário. por aí.
jalf

Respostas:

37

Em uma turma do ensino médio, você está no nível mais básico do seu caminho para o domínio. As coisas abordadas em sua classe são o tipo de coisa que um programador profissional deve saber frio. De várias maneiras, isso é semelhante ao aprendizado de suas "tabelas de tempos". É claro que você sempre poderá pegar uma calculadora em um ambiente "real", mas essa memorização não apenas aumenta sua velocidade em tarefas mais complexas, mas também promove uma compreensão mais completa dos princípios básicos.

Por exemplo, você deve conhecer vários algoritmos de classificação, como eles são implementados, como eles funcionam, quando são mais usados ​​e quando não usá-los. Isso sempre pode ser pesquisado, mas não deveria ser - mais do que um matemático deveria procurar 6 vezes 8.

Jeffrey
fonte
9
Você deve conhecer a natureza básica dos algoritmos de classificação, mas já faz mais de 15 anos que tive a oportunidade de escrever algo diferente de uma classificação por bolha. (Por muito pequenos N é às vezes a melhor resposta.)
Loren Pechtel
1
Eu gostaria de poder dizer que todas as aulas de Ciência da Computação são boas. Na minha escola, eles ensinaram a sintaxe básica de java ... Durante o ano inteiro. Muitos da turma deixaram de se gabar de ser "um programador" quando não conseguiram explicar a diferença entre o tipo Bubble e o algoritmo de Dijkstra.
Daniel Gratzer
2
Como exemplo, como você pode procurar qualquer palavra em um dicionário, teoricamente você deve entender este artigo sobre o significado . Mas nossos cérebros lidam apenas com um número limitado de incompreensões aninhadas.
Benjol
1
E memorizar surpresa minhas tabelas de tempos não me serviu absolutamente de nada. Quanto tempo o engenheiro de software médio gasta implementando algoritmos de classificação? Oh espere, provavelmente cerca de 0 . Mesmo com a possibilidade remota de que a classificação fornecida pelo ambiente não seja boa o suficiente para você, você só precisa de um cara para escrever um algoritmo mais apropriado - e ele pode usar as informações disponíveis trivialmente em algo como Wikipedia para selecionar e implementar o algoritmo ideal - e você pode reutilizá-lo pelo resto do tempo.
DeadMG 8/12/12
2
@kaoD: E memorizar a referência não vai ajudar nisso nem um pouco. Não envolve criar nada, é apenas uma pasta de cópia. A única diferença entre responder da memória e copiar e colar da Wikipedia é que um é armazenado na RAM e outro no cérebro. Ainda é um copiar e colar.
DeadMG
14

Geralmente, é ensinado dessa maneira, porque os professores geralmente não conhecem outra maneira de testar a compreensão. Seus sentimentos são completamente corretos, pois é inútil ser ensinado assim. A maneira como as pessoas são educadas em geral precisa desesperadamente de reformas!

Porém, a vida melhora, pelo menos na UIUC eu descobri que quanto mais alto você passa nas aulas de ciências, menos os exames são orientados conforme a descrição e, na maioria dos meus cursos, temos uma folha de dicas para toda a porcaria que você provavelmente teria pesquisado no Google se estivesse realmente sentado em um computador.

Dito isto, quanto mais alto eu fui em minhas aulas, menos eles realmente ensinaram sobre idiomas ou como implementar algo. Na verdade, eu só tive uma aula em que eles realmente nos ensinaram alguma coisa sobre programação, na maior parte são conceitos matemáticos abstratos e espera-se que apenas descubram a parte da programação por conta própria (desde que eles sempre tenham prazer em ajudar, mas isso foi nunca algo em um exame).

rudolph9
fonte
2
+1 Amém. Eu costumava ensinar programação no nível da faculdade, e meu objetivo era mover os alunos o mais rápido possível para o ponto em que eles pudessem realizar seus próprios projetos. Eu odeio quando os professores tratam isso como memorizar ou fazer as coisas da "maneira certa". O que eu tentei fazer foi colocar as habilidades necessárias para liberar a criatividade dos alunos.
8118 Mike Dunlavey
... Eu tive alunos muito inteligentes e muito bons em memorizar. Eles precisariam de um ou dois testes antes que eu pudesse transmitir que você precisa escrever programas para aprender programação, não memorizar coisas.
Mike Dunlavey
Ouça ouça! É engraçado, crescer, nunca fui bom na escola; pontuação ruim no ACT, notas ruins etc. Mas, ao ser apresentado ao CS, tudo fazia sentido. Definitivamente, luto em certas áreas, mas só aprendi a superar as coisas que me impediram de entender os conceitos que aprendi nas minhas aulas de ciências da computação.
Rudolph9
10

Não deixe que a escolaridade interfira na sua educação.

- Mark Twain

Sou mexicano e estou lhe dizendo isso, porque no México não é exatamente um bom lugar para a educação (em qualquer nível), pelo menos na educação pública.

Bem, no meio da minha carreira (CS), eu me sinto exatamente da mesma maneira que você está se sentindo, então começo a aprender sozinho e passo um ano aprendendo algoritmos, linux, scripts, como meu computador funciona, um pouco de relacionamento. bancos de dados, html, css, etc (um pouco sobre tudo). E, é claro, tive que pular as aulas *, baixar minhas notas * e me formar um ano depois *, tudo para aprender.

Depois desse ano, volto à minha rotina "normal", voltando às aulas regulares, trabalhos de casa, exames e projetos. As aulas ainda eram chatas, nada de novo para aprender, tudo era o mesmo. Então, decidi entrar para a programação de sites de concursos como o juiz UVA on-line , o chef de código e o euler do projeto , depois assisti a algumas palestras no MIT Open Course Ware e ainda estava aprendendo sozinho, mas de uma maneira diferente.

A lição: não deixe as coisas acontecerem, faça as coisas acontecerem. Se você não estiver satisfeito com a maneira como está aprendendo, mude!

* Não são as decisões mais sábias que tomei.

razpeitia
fonte
4
"Não deixe as coisas acontecerem, faça as coisas acontecerem", - Se alguma vez houve palavras para viver, são essas!
GrandmasterB
+1 para a cotação. I <quase> não tem que ler o resto da resposta
Chani
3

Depende do que você está tentando memorizar ...

Para estudar matemática, por exemplo, você deve estar familiarizado com a álgebra e, com frequência, deve ser bastante criativo na maneira de executar manipulações algébricas para simplificar as equações. Mas você deve ter memorizado certos componentes para poder se concentrar nesses bits interessantes. Você deve, por exemplo, conhecer suas tabelas de multiplicação de cor e conhecer algumas identidades para poder reconhecer como manipular as equações para poder usá-las.

Para estudar ciência da computação, você também precisa estar familiarizado com estruturas e algoritmos básicos de dados de blocos de construção, porque precisará aplicá-los a problemas de nível superior. É altamente improvável que você, por exemplo, escreva sua própria implementação de lista vinculada no mundo real, simplesmente use a fornecida por sua biblioteca. Mas, sabendo como uma lista vinculada é implementada e como implementar a sua própria, você poderá raciocinar sobre onde e se deve usar uma lista vinculada quando começar a trabalhar em problemas de nível superior. Da mesma forma, você nunca escreveria sua própria função de pesquisa binária, mas é importante entender como funciona para que você possa raciocinar sobre coisas como onde um banco de dados poderia usar um índice e onde não.

Depois de memorizar alguns componentes básicos, é muito mais fácil fazer coisas como interpretar a documentação. A documentação pode indicar que uma lista está sendo usada e supor que o programador saiba implicitamente que isso significa que inserções são O (1) e pesquisas são O (n). Os blocos de construção também são muito mais estáveis ​​ao longo do tempo - é muito provável que você use novos depuradores a cada poucos anos, provavelmente use a mesma pesquisa binária em toda a sua carreira.

Justin Cave
fonte
Onde e se usar uma lista vinculada é baseado em coisas como complexidades para várias operações e desempenho de memória. Você não precisa implementar um para saber uma dessas coisas. Onde um banco de dados pode usar uma pesquisa binária? Para chaves que ele sabe comparar. Bem, isso foi fácil.
23413 DeadMG
3

"Por que o ensino de CS é focado na memorização ... em vez de ensinar habilidades úteis" - Eu acho que você está descartando demais a memorização. Assim como você deve praticar a escrita de código, a interpretação da documentação e o depurador, também deve praticar a memorização.

Você pode se surpreender com o quão mais eficiente pode se tornar se não precisar ir à referência da API com tanta frequência ou procurar tantos comandos de depuração.

Uma das melhores coisas que aprendi no ensino médio foi observar um amigo que nunca fazia anotações nas aulas. Seu argumento era que ele conseguia se lembrar do que era importante. Comecei a fazer a mesma coisa e acho que melhorou minhas habilidades de memorização, que acho muito úteis diariamente, mesmo com todas essas referências de API disponíveis.

DXM
fonte
2
Não ter que procurar a API vem através da prática, não ensinar a API como educação formal.
DeadMG
@DeadMG: Ser capaz de lembrar de mais coisas vem com a prática, como todo o resto. Exigir que você lembre-se de certas APIs não é um objetivo em si, mas um meio de treinar sua mente para reter informações, para que você não precise procurá-las com tanta frequência. E não estou falando apenas de APIs, se me lembro de mais uma coisa, é menos uma viagem que preciso fazer no Google / MSDN / outro arquivo de origem e, com a prática, isso faz a diferença na rapidez com que você é capaz de trabalhar .
DXM
Pratique com essa API específica . Não memorizando as coisas em geral. E o tempo gasto na educação é uma pequena nota de rodapé em comparação com o tempo profissional.
DeadMG
2

Os exames com caneta e papel realmente fazem sentido se o objetivo é testar uma compreensão completa do assunto em questão. Eu fiz o exame Computer Science AB há quase uma década e concordo com o método de caneta e papel.

Você deve conhecer o suficiente de qualquer algoritmo aprendido nos níveis mais baixos da Ciência da Computação para poder raciocinar como escrever o código de implementação no idioma de destino. Os alunos também devem poder escrever o código manualmente, com a sintaxe mais correta. Às vezes, todos nós perdemos um ponto-e-vírgula ou parênteses :). Além disso, as habilidades de depuração e design podem ser testadas sem inferência de um IDE útil.

Se um aluno não pode fazer isso, ele não possui domínio desse tópico, apenas talvez uma familiaridade passageira.

Peter Smith
fonte
-1: Toda a escrita manual do código sintaticamente correto informa que a pessoa é capaz de escrever um programa compilável (provavelmente um milhão de vezes mais lento que o computador mais lento) - o que pode não funcionar como o esperado. Pior, eles apenas têm uma boa memória e provavelmente podem recitar Shakespare se solicitado. Isso indica pouco a habilidade da pessoa como desenvolvedor.
mattnz
Esta resposta não apresenta justificativa para a opinião apresentada. Por que alguém deveria ser capaz de escrever uma implementação para qualquer algoritmo de classificação em seu idioma favorito?
DeadMG 8/12/12
O ponto não é que essa pessoa seja uma boa desenvolvedora, é que eles conhecem o material de Ciência da Computação ensinado em sua classe. Se um aluno foi ensinado a representar graficamente uma função, é razoável esperar que ele faça isso em um exame. Bons testes também superam a memorização, fazendo perguntas que exigem entendimento conceitual, como implementar a classificação de bolhas usando várias chaves para essa estrutura de dados. Acabei de sair do nada ou explicar a diferença entre esse código de código de pesquisa que ofereço e a pesquisa binária.
Peter Smith
-2

Na minha experiência, a memorização vem com uma prática simples e não há absolutamente nenhuma necessidade de ensiná-la. Mais importante, essa abordagem significa apenas memorizar o que você realmente precisa lembrar no que estiver fazendo, e não um monte de lixo aleatório que seu professor espera que você possa precisar e, invariavelmente, você não precisará. O tempo gasto memorizando a implementação de algum algoritmo poderia ser muito melhor dedicado a alguma outra causa.

Afinal, por que você precisaria praticar a escrita de um algoritmo? Depois de escrevê-lo uma vez, você pode reutilizá-lo o tempo todo, mesmo com a chance extremamente remota de que outra pessoa ainda não tenha escrito uma implementação disponível gratuitamente para o idioma de sua escolha e de que seu ambiente ainda não tenha fornecido tais informações. um algoritmo para seu uso, que não é trivialmente verdadeiro para a grande maioria dos algoritmos simples, como classificação e coisas do tipo. Praticando algo em que é altamente improvável que você tenha que fazê-lo em primeiro lugar e, mesmo que você o faça, só precisará fazê-lo uma vez? Não é um uso valioso do tempo.

O importante a saber sobre o Heapsort não é como implementá-lo. É a complexidade operacional nos melhores e piores casos, e coisas semelhantes. Mas, surpresa, há uma tabela prática na Wikipedia que fornecerá instantaneamente essas informações. Então, novamente, não há valor em ter esse conhecimento. Está disponível instantaneamente para você sempre que você quiser, a partir de agora até o final dos tempos, sem nenhum custo. Então, por que você quer memorizá-lo? É inútil.

Na minha experiência, não há absolutamente nenhuma razão para exigir que um aluno memorize qualquer coisa. Se você está fazendo uma pergunta que pode ser respondida de uma fonte de referência, está fazendo uma pergunta em que poder respondê-la não tem valor.

DeadMG
fonte
2
Gee, rapazes, não se incomode explicando seus downvotes ou qualquer coisa assim ....
DeadMG
A única vez em que precisei conhecer o heapsort foi quando precisei de uma fila de prioridade modificável (o heapsort funciona muito bem como uma fila de prioridade). Ser capaz de adaptar algoritmos conhecidos é um bom motivo para saber como implementá-los.
David Thornley
@ David: Você não precisa saber como o heapsort funciona. Uma implementação usando qualquer algoritmo de classificação seria boa.
DeadMG 8/12/12
Não nesse caso particular, não seria. Ele teve que lidar com muitos eventos, freqüentemente, em um sistema que já pode estar sobrecarregado. Para esse projeto, precisávamos de eficiência e conseguimos. Por um contexto, isso aconteceu uma vez em uma carreira bastante longa, e toda a minha classificação por um longo tempo foram coisas como a família de SQL ORDER BYe C ++ std::sort.
David Thornley
@ David: Por isso, sugiro que dificilmente é algo que todo programador precisa.
DeadMG 8/12/12