Le cours expose les concepts de base, logique de fonctionnement, technologie et programmation des ordinateurs et systèmes informatiques. Il est destiné aux débutants avec peu ou pas d'expérience en programmation.
Les principaux thèmes traités sont :
Logiciel (systèmes d'exploitation, langages de programmation, compilateurs et interpréteurs)
Logique de la programmation
Structure d'un programme
Variables
Fonctions
Structures de données (listes, dictionnaires, ...)
Résolution des problèmes et conception des algorithmes
Structures algorithmiques de base (branchement, boucles, récurrence)
Entrées/sorties
Fichiers
Exceptions
Le langage de programmation utilisé pour ce cours est le langage Python.
Objectifs de formation
Être capable d'écrire et d'exécuter un programme dans différents environnements (en ligne, sur son système, sur un système Linux distant).
Être capable de retranscrire un algorithme simple et l'exprimer avec des fonctions.
Être capable de sélectionner les structures appropriées aux problèmes.
Le cours expose des aspects plus avancés de la programmation : paradigmes « orienté objet » et « fonctionnel ». Prérequis (Programmation I) : connaissances de base en programmation (bonne maîtrise du paradigme impératif et/ou connaissance de langage(s) de haut niveau).
Les principaux thèmes traités sont :
Principes d'abstraction
Objets et classes
Encapsulation, héritage, sous typage, polymorphisme
Comparaison de l'approche POO entre Python et Java
Il existe une de nombreux langages de programmation qui s'appuient sur divers concepts fondamentaux. La connaissance de ces concepts sont importants pour la maitrise de la programmation et également pour l'enseignement de celle-ci. La programmation impérative, basée sur l'architecture de von Neumann, la programmation orientée objet basée sur les principes de structuration des données et des types de données, la programmation fonctionnelle, basée sur les fonctions et le modèle du Lambda Calculus - et la programmation logique, basée sur la logique du premier ordre seront abordés. Ils seront explicités en explorant leurs concepts propres et les concepts communs tels que la notion de typage statique et dynamique, la notion de fonction ou de procédure et la généricité.
Nous abordons également des moyens simples de description de la sémantique opérationnelle formelle pour les langages informatiques et de son utilité.
Objectifs de formation
Syntaxe abstraite et concrète; Programmation logique simple; Différenciation entre les systèmes de types statiques et dynamiques; types de données abstraits; Utilisation de règles d'inférence pour formaliser un langage; Interprétation de quelques concepts fondamentaux des langages avec des règles sémantiques formelles.
La pensée algorithmique peut se définir comme une approche englobant les processus de pensée impliqués dans la formulation de problèmes et l'expression de leurs solutions, de manière à pouvoir appliquer ces dernières automatiquement. Concrètement, ces solutions sont exprimées en termes d'algorithmes, qui sont à leur tour écrits dans un langage de programmation traduit pour s'exécuter sur un dispositif informatique matériel, tels qu'un ordinateur de bureau, un serveur dans un centre de calcul, une tablette, ou même un smartphone. Bien que cette approche soit essentielle au développement logiciel, sa portée va bien au-delà de la programmation. Tout comme les mathématiques ne sont pas utiles qu'aux mathématiciens, la pensée algorithmique est applicable dans de nombreux domaines, pas uniquement l'informatique, et peut être appliquée à la résolution de nombreux problèmes.
Ce cours offre une première introduction à l'analyse algorithmique, à travers la présentation de structures de données fondamentales, telles que les listes, les tableaux associatifs, les arbres et les graphes, et la présentation d'algorithmes résolvant des problèmes classiques, tels que le tri et la recherche d'information, la navigation dans un graphe. Ces structures de données et ces algorithmes sont introduits et analysés théoriquement, à travers du pseudo-code, et implémentés à travers des exercices de programmation en Python et en Java. L'utilisation de deux langages de programmation a pour objectif de distinguer les concepts de leurs implémentations particulières.
Prérequis La connaissance d'au moins un langage de programmation, idéalement Python ou Java, est fortement recommandée.
Références
Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein. Introduction to Algorithms, 3rd Edition. MIT Press.
Lors de ce cours, nous passerons en revue des concepts fondamentaux d'algorithmique, comme :
l'utilisation du hasard en algorithmique
la récursivité
les algorithmes sur des graphes
les algorithmes gloutons
la programmation dynamique
Ceci nous permettra d'étudier des algorithmes classiques, ainsi que plusieurs de leurs applications :
la recherche de grands nombres premiers et leur utilisation en cryptographie
la construction de tables de hachage
les algorithmes de Gauss et de Strassen pour la multiplication de nombres et de matrices
la transformée de Fourier rapide
la recherche de composantes connexes dans un graphe et les crawleurs du web
l'algorithme PageRank et les recherches sur le web
l'algorithme BFS et le routage dans un réseau
le codage de Huffman et la compression de données
la résolution de deux problèmes célèbres en informatique : le problème du sac à dos et le problème du voyageur de commerce
Note : Ce programme (ambitieux) est encore sujet à modification ; en particulier, les notions essentielles à la compréhension de chacun de ces sujets seront introduites au fur et à mesure, et le rythme du cours n'est ainsi pas encore complètement déterminé.
Pré-requis des notions de base en mathématiques (niveau maturité - idéalement OS maths/physique)
Référence de base Dasgupta, C. Papadimitriou, U. Vazirani, Algorithms, McGraw Hill 2006
Autres références
Cormen, Algorithms Unlocked, MIT Press 2013
Mitzenmacher, E. Upfal, Probability and Computing, Cambridge University Press, 2017
Objectifs de formation
acquérir une culture générale dans le domaine de l'algorithmique
comprendre les principes fondamentaux derrière certains algorithmes qui font désormais partie de notre quotidien, sans que l'on ne s'en rende forcément compte
Lors de ce cours, nous aborderons la question de la calculabilité.
À travers des modèles mathématiques, nous explorerons de manière formelle ce qu'est une machine à calcul, un algorithme. Ces modèles nous permettront d'étudier les limites fondamentales de ce qui est calculable à l'aide d'une procédure algorithmique. Au passage, nous examinerons certaines applications pratiques de ces modèles en informatique.
En seconde partie, nous aborderons également la théorie de la complexité : Nous nous intéresserons non plus uniquement à examiner ce qui est calculable, mais nous nous intéresserons aussi à la difficulté théorique des problèmes.
Les sujets principaux :
Problèmes et langages
Automates finis et expressions régulières
Automates à pile et grammaires non contextuelles
Machine de Turing et fonctions récursives
Thèse de Church-Turing
Indécidabilité
Complexité, NP-complétude, P vs NP
Références
Introduction à la calculabilité : Cours et exercices corrigés, 3ème édition, Pierre Wolper
Objectifs de formation
Après avoir suivi ce cours, les participants devraient être capables :
d'encoder un problème sous forme de langage
d'implémenter des solutions à des problèmes à l'aide de divers formalismes (automates, expressions, grammaires, machines de Turing, etc.)
de comprendre les limites théoriques des modèles de calcul, et de démontrer ces limites à l'aide de diverses techniques (« gonflement », « diagonalisation »)
de catégoriser un problème selon sa décidabilité et sa complexité, et de justifier cette catégorisation (notamment par réduction)
Le cours présente les approches analytiques et techniques qui doivent permettre aux étudiants d’appréhender la structure, les composants principaux et le fonctionnement d’un système informatique. Il aborde les thèmes 1) des systèmes et de l’architecture des systèmes ; 2) des systèmes informatiques ; 3) de l’architecture des ordinateurs ; 4) des systèmes d’exploitation ; et 5) des réseaux ; en fournissant aux étudiants une base théorique minimale et des éléments pour approfondir leurs connaissances. En parallèle, les étudiants sont amenés à effectuer une recherche en petits groupes sur un système informatique donné et une recherche personnelle sur un composant de ce système, à documenter ces recherches et à réviser le travail de recherche de leurs pairs.
Objectifs de formation
Après avoir suivi ce cours, les étudiants sont capables :
de reconnaître un système informatique lorsqu’ils en voient un
d’en identifier les principaux composants fonctionnels et techniques
d’effectuer une recherche sur ces composants afin de comprendre leur rôle et leur fonctionnement
de documenter le résultat de cette recherche et de transmettre cette connaissance à des pairs
de comprendre comment ce système s’intègre dans son environnement et comment il fonctionne effectivement
Ce module introduit la sécurité et la confidentialité de nos données en suivant les attaques et les défenses dans le monde informatique. Nous allons suivre les données depuis l’imagination dans notre cerveau, à travers nos outils informatiques, le réseau, sur les serveurs distants, et boucler la boucle en passant par les services d’agrégation comme Facebook pour retourner dans notre cerveau. Pour chaque étape quelques attaques et défenses spécifiques vont être étudiées en détail et d’une manière pratique.
Nous verrons autant les défenses systémiques que les producteurs de logiciels doivent mettre en place, tout comme les défenses supplémentaires que les utilisateurs peuvent ajouter par l’installation de logiciels ou leur choix de service.
Dans la partie d’exercices nous allons utiliser des outils concrets pour vérifier et protéger les données, faire de l’anonymisation, protéger nos mots de passes, et regarder comment fonctionne une blockchain.
Objectifs de formation
pouvoir lister les attaques possibles sur nos données à travers leur existence, ainsi que les défenses à disposition
savoir chiffrer et déchiffrer des données avec OpenSSL et vérifier leur origine avec sha256
proposer des minimisations de collecte et comment anonymiser les données pour garantir la confidentialité
comprendre l’utilité et la fonctionnalité d’une blockchain et savoir l'explorer
L'apprentissage automatique a connu de nombreuses avancées au cours des dernières années, permettant d'atteindre des performances humaines (voir supra-humaine) dans des tâches telles que la reconnaissance d'objets ou le jeu de go. Dans ce cours, nous étudierons des outils de probabilité/statistique, d'optimisation et d'algèbre linéaire afin de comprendre les bases de l'apprentissage supervisé, non supervisé et de renforcement. Nous étudierons les principes de régression et de classification au travers de méthodes linéaires et non linéaires, la réduction de dimension, le regroupement et la prise de décision séquentielle. Nous appliquerons ces théories dans des exercices de programmation écrits dans des langages de haut niveau comme python/R/julia.
Objectifs de formation
À la fin du cours, les participants sont capables de
Expliquer les concepts de base de l'apprentissage automatique.
Appliquer les outils d'apprentissage automatique aux données.
Ce cours enseigne les bases du génie logiciel (« software engineering »), qui ont pour but de rendre le travail en équipe à grande échelle possible.
En effet, savoir écrire du code ne suffit pas pour travailler en équipe : il faut synchroniser les changements entre développeurs pour éviter de se marcher sur les pieds, tester automatiquement son code pour éviter d'envoyer du code non fonctionnel au reste de l'équipe, etc.
Il est aussi question d'autres exigences que seulement « le code produit la bonne réponse », comme la sécurité et l'éthique. De plus, « la bonne réponse » est rarement définie précisément.
Ce cours contient une partie « mini-projet » pour appliquer en pratique la théorie vue en cours.
Connaissances de mathématiques requises Niveau I (discipline fondamentale de mathématiques au gymnase)
Objectifs de formation
Savoir utiliser les outils modernes pour développer en équipe : gestion de versions, intégration continue, tests automatisés, méthodes de développement agile
Connaître les problématiques du génie logiciel moderne : validation des exigences, éthique, sécurité, performance
Savoir organiser du code et se retrouver dans une grande base de code : documentation, patrons de conception courants
Développer un mini-projet avec les connaissances acquises dans le cours
Ce cours présente une sélection de chapitres en mathématiques discrètes et probabilités. Nous commençons par une récapitulation de certains concepts fondamentaux. La première partie traite de la combinatoire avec une vue d'ensemble des choix avec et sans ordre ou répétition, ainsi que de notions de base en probabilités telles que la modélisation d'expériences aléatoires, la probabilité conditionnelle ou encore les variables aléatoires. Des applications en informatique sont présentées. La deuxième partie comporte trois chapitres introductoires en mathématiques discrètes, à savoir la théorie des graphes, la théorie des automates et les langages qu'ils génèrent, ainsi que la logique.
Objectifs de formation
Après avoir suivi ce cours, les étudiants sont capables de
caractériser des problèmes de combinatoire et calculer le nombre de cas concernés
formaliser des problèmes en probabilités et calculer la probabilité d'événements
comprendre le fonctionnement de méthodes simples en cryptologie basés sur les probabilités
traduire certains problèmes, tels que la recherche d'un chemin le plus court, dans le formalisme de la théorie des graphes et les résoudre à l'aide de propriétés de graphes
construire des automates qui reconnaissent un langage donné
décider si un langage donné peut être reconnu par certains types d'automates
traduire certaines questions dans le formalisme de la logique et y répondre
Des données sont collectées et analysées chaque jour, il est donc essentiel de se former à leur stockage et à l’extraction d’informations à partir de celles-ci. Ce cours vise à présenter des concepts fondamentaux liés aux bases de données. Vous allez premièrement découvrir toutes les étapes de création d’une base de données relationnelle, de la modélisation à son implémentation concrète avec le langage SQL. Deuxièmement, vous découvrirez comment extraire des informations à partir d’une base de données existante en utilisant des requêtes SQL ainsi qu’un logiciel permettant de créer des visualisations de données.
La partie pratique du cours ainsi que la réalisation d’un projet à réaliser en groupe requièrent l’utilisation d’un ordinateur portable personnel.
Connaissances de mathématiques requises Niveau I (discipline fondamentale de mathématiques au gymnase)
Références
Modélisation des bases de données : UML et les modèles entité-association - Christian Soutou et Frédéric Brouard - 2017
SQL par l’exemple et la pratique professionnelle des bases de données - Sylvain Berger et al. - 2017
Administrer vos bases de données avec MySQL - Chantal Gribaumont - 2014
Modéliser par l’exemple - Gabor Maskay et Yves Pigneur - 2015
Objectifs de formation
Au terme de la formation, l’étudiant-e doit être capable de :
Analyser un contexte métier donné
Traduire un contexte métier en modèle conceptuel
Traduire un modèle conceptuel en modèle relationnel
Créer une base de données à l’aide du langage SQL
Extraire des informations à partir d’une base de données en utilisant des requêtes SQL et en réalisant des visualisations de données
Utiliser un système de gestion de bases de données intitulé MySQL
UNINE, Unimail, Rue Emile-Argand 11, CH-2000 Neuchâtel, C001
vendredi 10 février 2023
09h15-12h00
13h15-17h00
UNINE, Unimail, Rue Emile-Argand 11, CH-2000 Neuchâtel, C001
vendredi 24 février 2023
09h15-12h00
13h15-17h00
UNINE, Unimail, Rue Emile-Argand 11, CH-2000 Neuchâtel, B217
vendredi 10 mars 2023
09h15-12h00
13h15-17h00
UNINE, Unimail, Rue Emile-Argand 11, CH-2000 Neuchâtel, B217
vendredi 24 mars 2023
09h15-12h00
13h15-17h00
UNINE, Unimail, Rue Emile-Argand 11, CH-2000 Neuchâtel, B013
vendredi 31 mars 2023
09h15-12h00
13h15-17h00
UNINE, Unimail, Rue Emile-Argand 11, CH-2000 Neuchâtel, B217
Projet individuel
Il s'agit d'un travail personnel qui est réalisé par les étudiant-e-s sous la responsabilité d'un-e enseignant-e. Les étudiant-e-s doivent résoudre un problème spécifique et mettre en pratique leurs connaissances acquises durant les études.
Une description du projet individuel est disponible ici.
Le formulaire qui doit être rempli au début du projet individuel est disponible ici.
Calendrier
Le calendrier de la première et deuxième édition est disponible ici.