- Este texto propõe disciplinas de ciência da computação realistas e satíricas que desenvolvedores de software deveriam cursar, embora elas não existam de fato
- Cada disciplina expõe de forma crítica problemas da cultura moderna de desenvolvimento e modos de pensar enviesados
- Por exemplo, aborda a fé cega no paradigma orientado a objetos, o descaso com a UX de ferramentas de linha de comando e os equívocos sobre desempenho em linguagens lentas
- Também inclui matérias sobre obsessões psicológicas e hábitos improdutivos dos desenvolvedores
- No geral, apresenta de forma bem-humorada as limitações do ensino de ciência da computação e a necessidade de autocrítica na cultura de desenvolvimento
CSCI 2100: Esquecendo a programação orientada a objetos
- Esta disciplina ensina o conceito de variáveis e funções que não pertencem a uma hierarquia de objetos
- Afasta-se do pensamento centrado em orientação a objetos para explorar a flexibilidade e a simplicidade da programação funcional
- Apresenta “função (function)” como um conceito mais geral e reutilizável do que “método (method)”
- O pré-requisito é qualquer disciplina que tenha usado o termo “abstract base class”
- O objetivo é desmontar a dependência excessiva do paradigma orientado a objetos e reformular a forma essencial de pensar sobre programação
CSCI 3300: Estudos de software clássico
- Uma disciplina de análise e discussão de produtos de software historicamente importantes
- Entre os exemplos abordados estão VisiCalc, AppleWorks, Robot Odyssey, Zork e MacPaint
- O foco está em interface do usuário (UI) e no impacto das limitações de hardware sobre a criatividade
- Ao revisitar inovações nascidas sob restrições do passado, a disciplina relança luz sobre os princípios fundamentais do design de software moderno
CSCI 4020: Escrevendo código rápido em linguagens lentas
- Trata de como escrever código de alto desempenho mesmo em linguagens interpretadas (como Python)
- Explora estratégias para realizar análise de desempenho (performance analysis) em alto nível e alcançar eficiência no nível de C++
- Busca ao mesmo tempo reduzir a fragilidade do código e preservar o prazer de desenvolver
- A disciplina quebra o senso comum de que “linguagens lentas são lentas” e mostra as possibilidades de otimização no design da linguagem e no ambiente de execução
CSCI 2170: Experiência do usuário (UX) para ferramentas de linha de comando
- Disciplina introdutória sobre princípios de design da experiência do usuário para programas baseados em linha de comando
- Tem como temas centrais a relevância, legibilidade e concisão da saída
- Usa o comando
ls do UNIX como estudo de caso para analisar o excesso de opções e os problemas de interfaces complexas
- Enfatiza que ferramentas de linha de comando também precisam de design centrado no usuário, assim como interfaces gráficas
PSYC 4410: A psicologia das obsessões do programador
- Explora obsessões improdutivas e padrões de pensamento compulsivos em que desenvolvedores de software costumam cair
- Ex.: formatação de código, taxonomia, sistemas de tipos, fragmentação excessiva de arquivos etc.
- Analisa psicologicamente a reação crítica automática (knee-jerk criticism) que surge ao entrar em contato com sistemas desconhecidos
- É uma disciplina para compreender vieses cognitivos e tendências perfeccionistas dos desenvolvedores e buscar equilíbrio entre colaboração e criatividade
Contexto geral
- Esta lista não é um plano de ensino real, mas sim uma crítica satírica ao ensino de ciência da computação e à cultura de desenvolvimento
- Cada disciplina revela pontos cegos do pensamento centrado na tecnologia e incentiva os desenvolvedores à flexibilidade de pensamento e à autorreflexão
- Embora seja um post de 2015, traz questionamentos que continuam válidos até hoje
1 comentários
Opiniões do Hacker News
CSCI 3300: Estudos Clássicos de Software
O que Alan Kay vem enfatizando há décadas é que continuamos reinventando conceitos que já estavam estabelecidos no fim dos anos 70
Concordo com a frustração dele de que, assim como artistas estudam história da arte, programadores também deveriam estudar a história da ciência da computação
Acho forçado comparar computação, que depende de desempenho físico de hardware, com arte
Achar que a forma de resolver problemas em 1970 se aplica intacta em 2025 é ignorar a realidade
É interessante essa repetição de redescobertas em que cada geração acha que foi a primeira a descobrir algo
Aprender os problemas e soluções do passado nunca é perda de tempo
Nesse processo, passei a entender profundamente a evolução do Unix e do software comercial, e concordei totalmente com Alan Kay
CSCI 3240: Ignorando o Hype
Uma disciplina para aprender a ignorar modas de plataformas ou bibliotecas recentes
Em seguida, CSCI 3120: Desenvolvimento Guiado por Novidade trata do oposto: como acompanhar as tendências e manter o interesse
As duas disciplinas não podem ser cursadas ao mesmo tempo
Outras matérias poderiam incluir técnicas de reunião (PSYC 4870) e tolerância ao atrito organizacional (PSYC 5630),
cobrindo comunicação e motivação realistas no ambiente de trabalho
CSCI 4810: O Laboratório da Recusa
Uma disciplina de laboratório em que pedidos antiéticos de produto e pressão de prazo são simulados, e você só passa se conseguir recusá-los com base em padrões profissionais
Sugestão de disciplina de depuração
Seria ótimo haver uma matéria para aprender a encontrar a causa raiz de bugs e usar várias ferramentas
printPrecisamos de tempo para falar sobre o salvador da depuração interativa
CSCI 0001: Programação funcional e teoria dos tipos
A terminologia obscura e as fórmulas da academia vêm atrapalhando a popularização da programação funcional
Chegou a hora de aprender diretamente por que um monad é um monoid na categoria dos endofunctors
CSCI 4020: Escrevendo Código Rápido em Linguagens Lentas
Uma disciplina que ensina complexidade algorítmica com linguagens lentas (VB, Ruby etc.) e mostra que um O(N) em Ruby pode vencer um O(N²) em C++
e lembro de ter ficado surpreso com o fato de o BASIC ter mostrado um resultado inesperadamente rápido
Deu para sentir na prática por que Python é útil em IA
Código vetorizado em memória linear é muito mais rápido do que dados espalhados no heap
Coletânea da série anterior
A série “Computer science courses that don't exist, but should” continua em
edição de 2015 (247 comments),
edição de 2017,
edição de 2018
Isso me faz lembrar de uma disciplina de Arqueologia de Software que fiz na faculdade
Era uma aula em que reimplementávamos exercícios de compiladores dos anos 1970,
e embora na época eu tenha achado inútil, mais tarde isso ajudou muito na minha compreensão de projeto de sistemas
É essencial saber rastrear bugs antigos, wikis, histórico de versões e histórico das equipes
Hoje, muitos programas de ciência da computação praticamente se transformaram em escolas profissionalizantes de programação
Os alunos sabem usar frameworks, mas não entendem a filosofia de projeto das linguagens nem a evolução dos sistemas
Não devemos esquecer que computação não é apenas implementação, mas também uma disciplina de pensamentos e ideias
Por causa dos critérios de credenciamento, é difícil se afastar muito do currículo
CSCI 3210: Codificação e processamento modernos de texto
Uma aula para aprender Unicode e UTF-8 e abandonar a noção de que “1 caractere = 1 byte”
Ela cobriria não só codificação, mas também busca, ordenação, renderização de fontes e tratamento de emoji
É algo básico, mas poucas pessoas realmente entendem direito