-
Notifications
You must be signed in to change notification settings - Fork 29
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
manifesto-de-ensino-em-cpp: Primeiro commit
Signed-off-by: Patrick José Pereira <[email protected]> Co-Authored-By: Tarcisio <[email protected]>
- Loading branch information
1 parent
26e463a
commit 3bbce94
Showing
1 changed file
with
73 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,73 @@ | ||
# Manifesto de Ensino em C++ | ||
|
||
Ensinar C++ é uma tarefa difícil, tanto para os alunos quanto para os professores. | ||
Este manifesto pretende garantir que esta tarefa não seja involuntariamente tão dolorosa para ambas as partes, | ||
fornecendo as melhores práticas atualizadas para o ensino. | ||
|
||
|
||
#### 1. Ensinarei C++ como uma linguagem de alto nível. | ||
* Muitos cursos adotam a abordagem de apresentar C++ no mesmo nível de abstração que C. Isso é **muito** equivocado. | ||
* Os programas em C++ são escritos para a "máquina abstrata" de C++, não para as CPUs da sua sala de aula, e os compiladores * otimizarão o código com as suposições da "máquina abstrata" em mente. | ||
* C++ permite níveis arbitrariamente altos de abstrações, geralmente sem penalidade de tempo de execução para o código otimizado, tanto para *inlining* quanto para otimização de tempo de linkagem ([*linking*][linking]). | ||
* [Expressive C++ Coding Challenge Results - Inglês](https://www.bfilipek.com/2017/10/expressive-cpp17-results.html) | ||
|
||
#### 2. Ensinarei os principais conceitos e valores de C++ | ||
* Semântica de valor. | ||
* Corretude na utilização de `const`. | ||
* *Ownership* e [*RAII*][RAII], gerenciamento de recursos. | ||
* Abstrações de custo zero. | ||
* Programação genérica e como aproveitar o sistema de tipos para fornecer garantias máximas em tempo de compilação em seu programa. | ||
* Em particular, evitando fazer em tempo de execução o que pode ser feito em tempo de compilação. | ||
|
||
#### 3. Vou me referir e me manter atualizado com as melhores práticas atuais | ||
* Os autores e designers de C++ criaram as [Diretrizes Principais do C++ (*C++ Core Guidelines*)][cppcoreguidelines], para informar qual é a melhor prática, em um idioma com mais de 40 anos de bagagem herdada. | ||
* [Collaborative Collection of C++ Best Practices](https://github.com/lefticus/cppbestpractices) | ||
|
||
#### 4. Não ensinarei o uso de versões desatualizadas do padrão C++. | ||
* As regras da *ISO* exigem que o **único** padrão válido seja o último disponível. | ||
* Não construímos casas novas com tomadas elétricas de 50 anos atrás. | ||
* Existe uma versão nova de C++ a cada três anos aproximadamente: quando os estudantes estiverem no mercado de trabalho, o que foi considerado de vanguarda durante as aulas será o predominante. | ||
* Não é necessário usar padrões não liberados, mas pode ser interessante, pelo menos, observá-los - esses são os padrões que entrarão em vigor quando os alunos estiverem finalizando seus cursos! | ||
|
||
5. Não usarei ferramentas desatualizadas para ensinar meus alunos | ||
* Windows: Prefira o MSYS2 com Clang, GCC ou um MSVC recente o suficiente para suportar o item número 4. | ||
* Ubuntu ou Debian: Se uma distribuição recente não estiver disponível, use os pacotes disponíveis em: https://apt.llvm.org/ | ||
* Mac: Prefira uma versão do MacOS recente com o Xcode mais recente disponível ou instale o GCC/LLVM mais recente do [*Homebrew*][homebrew] se o MacOS não puder ser atualizado. | ||
|
||
#### 6. Não ensinarei C++ como uma linguagem orientada a objetos | ||
* Porque não é. Pela própria palavra de seu criador, é uma linguagem multiparadigma. | ||
* Curiosidade: C++ é uma linguagem funcional bastante avançada, graças à computações a nível de tipos, e algum nível de [tipagem dependente][dependent_type] (parâmetros de [*template*][cppreference_template] que não são tipos). | ||
* C++ pode ser aproveitado para estudar quase toda a história da programação, então vamos aproveitar isso e fornecer bons exemplos para nossos alunos. | ||
|
||
#### 7. Não ensinarei dialetos especificos ou de plataformas em C++ | ||
* Sem "C/C++": [CppCon 2015: Kate Gregory “Stop Teaching C"](https://www.youtube.com/watch?v=YnWhqhNdYyk). | ||
* Sem C-com-classes: apenas ensine C ou Java se você realmente quiser fazer isso. | ||
* Sem "Java/C++". Dica: se você estiver escrevendo `new std::string`, há algo errado. | ||
* Sem `-fno-exceptions`: as exceções são uma parte essencial do C++. Elas dão todo o seu significado ao [*RAII*][RAII] e, exceto no Windows de 32 bits, são mais rápidas no "caminho feliz" do que retornar códigos de erro. | ||
* É mais fácil aprender a não usar exceções, se você já as conhece, do que aprender a usar exceções, se não. | ||
* Sem `conio.h` / `iostream.h` / `graphics.h` / qualquer [API][api] da era do DOS que você possa encontrar. | ||
|
||
#### 8. Não ensinarei padrões de desenvolvimento de software desatualizados | ||
Ao longo dos anos, vários padrões clássicos de desenvolvimento foram integrados em várias linguagens de programação, como recursos de linguagem ou biblioteca. | ||
* [*Closed polymorphism*][open_closed_principle]: [*visitor pattern*][visitor_pattern] -> Podem ser feitos com `std::variant` | ||
* [*Strategy pattern*][strategy]: Pode ser feito com `std::function` | ||
|
||
#### 9. Não ensinarei o `volatile` como um mecanismo de sincronização [*multithread*][multithreading] | ||
* Resumindo: Não funciona na maioria dos casos. | ||
* [`volatile` é util com threads ?](http://cxx.isvolatileusefulwiththreads.com/) | ||
* Use [`atomics`][cppreference_atomic]. | ||
|
||
[api]: https://pt.wikipedia.org/wiki/Interface_de_programa%C3%A7%C3%A3o_de_aplica%C3%A7%C3%B5es | ||
[cppreference_atomic]: https://pt.cppreference.com/w/cpp/atomic | ||
[cppreference_template]: https://en.cppreference.com/w/cpp/language/templates | ||
[open_closed_principle]: https://en.wikipedia.org/wiki/Open%E2%80%93closed_principle | ||
[cppcoreguidelines]: https://github.com/isocpp/CppCoreGuidelines | ||
[dependent_type]: https://en.wikipedia.org/wiki/Dependent_type | ||
[homebrew]: https://brew.sh/index_pt-br | ||
[linking]: https://pt.wikipedia.org/wiki/Ligador | ||
[multithreading]: https://en.wikipedia.org/wiki/Multithreading_(computer_architecture) | ||
[RAII]: https://pt.wikipedia.org/wiki/Aquisi%C3%A7%C3%A3o_de_Recurso_%C3%A9_Inicializa%C3%A7%C3%A3o | ||
[strategy]: https://pt.wikipedia.org/wiki/Strategy | ||
[visitor_pattern]: https://pt.wikipedia.org/wiki/Visitor_Pattern | ||
|
||
Versão e autor original do manifesto: [The C++ Teaching Manifesto - Jean-Michaël Celerier (@jcelerier)](https://github.com/jcelerier/cpp-teaching-manifesto) |