Notes de cours · INF 2007

Programmation avancée

Huit chapitres pour passer de « ça marche » à « je sais que ça marche, et je sais pourquoi c'est rapide ». Des tests au fuzzing, du complément à deux à l'UTF-8, des caches du processeur aux goroutines — le tout en Go.

À propos de ces notes

Ce cours ne vous apprend pas à programmer : il suppose que vous savez déjà écrire une boucle et une fonction. Il vous apprend à programmer correctement et efficacement — deux mots qui n'ont de sens que si l'on sait les vérifier.

D'où la structure : on commence par les tests, parce qu'un programme non testé ne fonctionne pas ; puis le contrôle de version, parce qu'un programme évolue ; puis les types et les bits, parce que c'est là que vivent les bogues étranges ; puis la mesure, parce qu'on n'optimise pas ce qu'on n'a pas mesuré ; et enfin les structures de données et la concurrence.

Le langage est Go, choisi parce que son outillage — tests, mesures, détecteur de courses, formatage — est intégré au compilateur. Rien à configurer : on peut parler du fond dès la première heure. Chaque chapitre se termine par un laboratoire aux réponses dépliables et par un court quiz.

Le manuel de référence est Maîtriser la programmation : des tests à la performance en Go. Ces notes en suivent le plan et le complètent ; elles ne le remplacent pas.

Le manuel du cours — à lire en premier

Maîtriser la programmation
Des tests à la performance en Go — Daniel Lemire

Chaque chapitre de ces notes accompagne un chapitre du manuel : lisez le chapitre, faites ses exercices, puis revenez ici. 312 pages, PDF de 1,2 Mo. Le PDF suffit pour tout le cours ; si vous préférez lire sur papier ou sur liseuse, le manuel se vend aussi en version papier et en version numérique.

Télécharger le PDF Chapitre par chapitre Version papier ou numérique sur Amazon.ca

Module 1 — La correction du logiciel

Tests

Les tests logiciels

go test, tests pilotés par table, cas limites et débordements, couverture de code, fuzzing et fonctions Example.

Lire le chapitre 1

Module 2 — La collaboration

Git

Le contrôle de version

Centralisé contre distribué ; les trois zones de Git ; branches, fusion et conflits ; comment se calcule réellement un diff.

Lire le chapitre 2

Module 3 — Les données

Types

Les types de données

Tailles et unsafe.Sizeof, complément à deux et débordement, IEEE 754 et NaN, tableaux, tranches, chaînes et pointeurs.

Lire le chapitre 3
Bits

Les bits et l'Unicode

Masques et opérateurs binaires, x & (x-1), math/bits, points de code, UTF-8, UTF-16 et paires de substitution.

Lire le chapitre 4

Module 4 — Le hasard et la performance

Hachage

Hachage, hasard et cardinalité

Fonctions de hachage et collisions, SHA-256, tables de hachage, mélange de Fisher–Yates, échantillonnage de réservoir, estimation de cardinalité.

Lire le chapitre 5
Mesure

Mesurer la performance

go test -bench et -benchmem, benchstat, hiérarchie de caches, prédiction de branchement, allocations et chiffres significatifs.

Lire le chapitre 6

Module 5 — Structures et concurrence

Structures

Les structures de données

Ce qu'est vraiment une tranche, la croissance d'append, le partage et les fuites par sous-découpage, les cartes, et comment choisir.

Lire le chapitre 7
Concurrence

La programmation concurrente

Goroutines et WaitGroup, canaux tamponnés ou non, mutex et atomiques, courses de données et -race, interblocages.

Lire le chapitre 8

Outils et références

Le manuel

Maîtriser la programmation

Le manuel du cours en PDF — 312 pages — et la correspondance chapitre par chapitre avec ces notes. C'est la lecture principale ; le reste l'accompagne.

Ouvrir le manuel
Avant de commencer

L'environnement de travail

Installer Go, vérifier son installation, configurer son éditeur, et écrire sa documentation en Markdown plutôt qu'en traitement de texte.

Préparer sa machine
Manipuler

Laboratoires interactifs

Calculateur 32 bits, analyseur Unicode, table de hachage à collisions, calculateur de différences et lecture d'un historique Git.

Ouvrir les laboratoires
Aide-mémoire

Pense-bête

Les commandes go et git, la syntaxe essentielle, les idiomes sur les bits, les verbes de formatage et les schémas de concurrence.

Ouvrir le pense-bête
Référence

Glossaire

Du complément à deux à l'interblocage : les termes du cours, définis brièvement et renvoyant au passage qui les développe.

Consulter le glossaire
Pour aller plus loin

Bibliowebographie

Le manuel du cours, la documentation Go, Pro Git, Hacker's Delight et les articles fondateurs.

Voir les références
Navigation

Rechercher dans les notes

Un moteur qui parcourt les huit chapitres, section par section, sans quitter le navigateur ni solliciter de serveur.

Ouvrir la recherche

À propos de l'auteur

Daniel Lemire

Professeur d'informatique · Université du Québec (TÉLUQ), Montréal

Les recherches de Daniel Lemire portent sur les structures de données et les algorithmes à haute performance — précisément le sujet de la seconde moitié de ce cours.

Il est l'un des auteurs de simdjson, une bibliothèque capable d'analyser plusieurs gigaoctets de JSON par seconde, et le concepteur des Roaring Bitmaps, un format d'index compressé — essentiellement une manipulation de bits à grande échelle, comme au chapitre 4 — utilisé au cœur d'Apache Lucene, d'Elasticsearch, d'Apache Druid, de ClickHouse et du moteur SQL de YouTube.

Ses travaux sur l'analyse rapide des nombres à virgule flottante ont été intégrés aux bibliothèques standard de plusieurs langages, dont Go. Son blogue, suivi par une vaste communauté de développeuses et de développeurs, aborde la performance, les algorithmes et la programmation. Il figure parmi les 2 % de scientifiques les plus cités au monde (classement Stanford/Elsevier).