Quelle est l’importance de savoir comment programmer pour le SDC?


66

Venant d'un contexte plus mathématique, je n'ai jamais vraiment appris à coder. Je commence un doctorat en SDC et beaucoup de gens ont été surpris par le peu de connaissances que j'avais sur la programmation (et sur l'ordinateur en général). Je peux écrire des algorithmes en pseudo-code, mais je ne connais pas vraiment de langage de programmation.

Je peux imaginer qu'un jour je devrais mettre en œuvre des algorithmes pour mon travail, mais puis-je attendre ce moment? Ou y a-t-il autre chose?

Quelle est l’importance de savoir coder dans TCS (dans les domaines où la programmation n’est pas directement impliquée): existe-t-il des raisons qui pourraient amener un théoricien du CC (par exemple) à savoir coder? Vaut-il la peine de passer beaucoup de temps à apprendre à coder? Et s’il en existe, y at-il une catégorie (fonctionnelle, impérative, orientée objet, etc.) de langage de programmation qui conviendrait mieux?


12
Vous devriez en avoir programmé certaines afin d'écrire un pseudo-code significatif, c'est-à-dire défini et reflétant l'exécution. Les mathématiciens ne font souvent ni l'un ni l'autre. En outre, si vous voulez réellement utiliser la théorie que vous développez, il est probable que vous devrez mettre en œuvre quelque chose. En ce qui concerne les langues, il vaut probablement mieux apprendre quelque chose de fonctionnel. C est agréable pour la performance mais difficile à raisonner et désordonné à bien des égards. (Comme vous pouvez le voir, YMMW)
Raphael,

6
Je suis d'accord avec "Les mathématiciens ne font souvent ni l'un ni l'autre." Un simple test permettant de savoir si un mathématicien décrivant un algorithme a jamais été réellement programmé consiste à demander "Que voulez-vous dire exactement par" étant donné un X ... "?"
Jeffε

4
La programmation, c'est quoi? Les théorèmes sont mes programmes. Une procédure de cuisson est différente de l'art de la cuisine. Désolé, dans plus de 20 ans, je ne peux lire aucun code de programme. En fait, je déteste ce bazar "se réaliser sur PC". (Déjà cette notation rend malade.) Euclid n'a pas pu programmer. Pourtant, il a créé des programmes pendant des siècles.
Stasys

6
@ StasysJukna: Euclid était en fait un programmeur vraiment vraiment nul. Non seulement il n'a jamais implémenté ses algorithmes, mais il ne les a même jamais exécutés à la main sur des cas de test moyennement compliqués.
Jeffε

3
@ Jɛ ff E: Oui, Euclid était un programmeur de merde, c'est exactement ce que je voulais dire. En TCS, nous avons tendance à ne pas distinguer entre les livres de cuisine et l'art d'armer. Euclid pourrait. J'ai beaucoup de respect pour les personnes qui participent au programme CAN. Mais je ne pense pas que cette fonctionnalité signifie "un CAN en TCS". Cela ne fera pas mal.
Stasys

Réponses:


55

L'informatique théorique est un vaste domaine et l'importance de la programmation dépend de ce que vous faites dans le SDC. Je mentionnerai deux manières dont la programmation peut vous aider, sans pour autant impliquer que ce sont les seules façons.

Premièrement, si vous concevez des algorithmes pour des problèmes d’importance pratique, leur mise en oeuvre et la mise à disposition du code pour des tiers peuvent constituer un avantage considérable. Par exemple, le problème de la coque convexe se pose dans de nombreux domaines et les utilisateurs utilisent des progiciels tels que cdd de Komei Fukuda et lrs de David Avis pour résoudre ce problème. S'ils n'avaient publié leurs algorithmes que dans des articles, probablement moins de gens l'auraient utilisé. Plus d'utilisateurs signifient plus de feedback et probablement aussi plus d'opportunités de collaboration, ce qui est inestimable.

Deuxièmement, même si vous ne travaillez pas dans des algorithmes, l'écriture d'un code à usage unique vous permet de tester une simple conjecture lorsque celle-ci convient au calcul numérique. Par exemple, si vous vous demandez si le produit de trois matrices définies positives a toujours une trace positive, il est facile d'écrire un code pour le tester sur des choix aléatoires de matrices définies positives 2 × 2 ou 3 × 3 et trouver un contre-exemple. Même si vous n'annoncez pas que vous avez écrit un programme quelconque pour tester la conjecture, la programmation peut vous faire gagner du temps, qui aurait été passé en vain à essayer de prouver une fausse déclaration.

Le langage de programmation à choisir dépend de ce que vous voulez faire avec la programmation, et cela peut être un sujet pour tout un livre à mon avis. Mais si vous concevez des algorithmes et souhaitez implémenter vos algorithmes afin que d'autres personnes puissent utiliser cette implémentation, un facteur important est la disponibilité. Bien que vous puissiez vous attendre à ce que la plupart des utilisateurs potentiels de votre code aient accès à un compilateur C, vous ne pouvez pas vous attendre à ce que les mêmes personnes aient accès à un compilateur Haskell. Pour les programmes uniques, le choix dépend davantage des bibliothèques disponibles et inclut des environnements tels que Matlab.

Au fait, programmer peut aussi être amusant.


2
@SureshVenkat: En fait, si la programmation est amusante, la question «Quelle est l'importance de la programmation?» Peut ne pas être très pertinente. Mais la majeure partie de ma réponse deviendra alors sans objet. Quelle tristesse! :)
Tsuyoshi Ito

Je n'avais pas pensé à votre deuxième argument auparavant, en effet il me semble une très bonne idée de tester une conjecture avec un programme court! En ce qui concerne la programmation, cela peut sembler amusant, mais je n’ai pas encore vu le long apprentissage long du week-end =).
Gopi

@ Gopi: Cela dit, beaucoup de conjectures ne cadrent pas avec ce cadre de «test avec un programme simple». Par exemple, nous ne pouvons généralement pas tester les comportements asymptotiques (au moins par un simple programme). Mais lorsque vous avez des conjectures que vous pouvez tester, une petite programmation peut être un outil puissant. Pour le plaisir, oui, je comprends. Je ne voulais tout simplement pas ignorer le point de vue «amusant» en énumérant seulement certaines motivations du point de vue «utilité».
Tsuyoshi Ito

3
Les notes de Knuth sur une classe de résolution de problèmes donnent un excellent exemple de l'interaction entre conjectures et code (voir Problème 1): www-cs-faculty.stanford.edu/~knuth/papers/cs1055.pdf (j'aime particulièrement l'image de quelqu'un se précipitant dans la classe portant un tas d'imprimés)
Suresh Venkat

47

Je me sens obligé de citer Doron Zeilberger à ce sujet:

Opinion 37 : La programmation est encore plus amusante que de prouver et, plus important encore, elle en donne autant, sinon plus, de perspicacité et de compréhension.

Lisez l'avis, c'est plein de pierres précieuses (en fait, il a tendance à être délibérément provocateur). Par exemple, "Le meilleur moyen de comprendre quelque chose est de l'enseigner. Mais mieux encore, l'enseigner aux humains, c'est de l'enseigner à un ordinateur".

Mon expérience personnelle est que même lorsque vous effectuez un travail purement théorique, vous aurez besoin de certains outils informatiques. J'évite beaucoup de manipulations algébriques de routine fastidieuses avec Mathematica. Je teste mes conjectures à moitié cuites en forçant brute de petites instances sur Matlab ou Python. J'ai co-écrit un article sur la combinatoire pure et c'est le travail qui a le plus profité de la réalisation d'expériences informatiques approfondies pour comprendre ce qui se passe. Euler a fait d’énormes tables de calculs fastidieux pour mieux comprendre les problèmes. Nous lui devons d’utiliser nos outils pour automatiser ce processus lorsque nous faisons des mathématiques.

De plus, si vous travaillez sur des algorithmes et des structures de données, la programmation donnera une perspective irremplaçable sur les questions d'efficacité et de convivialité. Mon opinion ici diffère quelque peu avec les autres. Je pense qu'apprendre un langage fonctionnel pour pouvoir écrire des preuves correctes est une perte de temps (je pense que c'est un point positif. Les personnes qui ont déjà utilisé un langage fortement typé ont probablement tendance à écrire des épreuves structurées avec plus de soin. pense pas que ça vaut la peine de passer du temps à faire cet exercice). La programmation fonctionnelle masque les problèmes de conception d'algorithmes et de temps d'exécution et met l'accent sur les problèmes de logique et de sémantique (et, bien sûr, l'apprentissage de la programmation fonctionnelle est probablement indispensable et viendra un peu naturellement si vous vous intéressez à la sémantique logique / PL). De même, Je pense qu'entrer dans les détails OO de Java et C ++ n'est pas non plus la meilleure façon de passer son temps, car l'objectif d'OO est d'écrire du code modulaire réutilisable. C'est la voie à suivre si vous produisez du code que d'autres peuvent utiliser. Mais au cas où vous voudriez avoir un aperçu de l'efficacité et du temps d'exécution, si vous vous souciez des algorithmes et des structures de données vraiment efficaces, j'appuie la suggestion de regarder en C. Cela vous permet de rester proche de la machine tout en fournissant un niveau d'abstraction raisonnable. . De cette façon, vous avez une idée de ce qui est rapide et de ce qui est lent, d'une structure de données raisonnable, etc. Mais au cas où vous voudriez avoir un aperçu de l'efficacité et du temps d'exécution, si vous vous souciez des algorithmes et des structures de données vraiment efficaces, j'appuie la suggestion de regarder en C. Cela vous permet de rester proche de la machine tout en fournissant un niveau d'abstraction raisonnable. . De cette façon, vous avez une idée de ce qui est rapide et de ce qui est lent, d'une structure de données raisonnable, etc. Mais au cas où vous voudriez avoir un aperçu de l'efficacité et du temps d'exécution, si vous vous souciez des algorithmes et des structures de données vraiment efficaces, j'appuie la suggestion de regarder en C. Cela vous permet de rester proche de la machine tout en fournissant un niveau d'abstraction raisonnable. . De cette façon, vous avez une idée de ce qui est rapide et de ce qui est lent, d'une structure de données raisonnable, etc.


10
"La programmation fonctionnelle masque les problèmes de conception d'algorithmes et de temps d'exécution et met l'accent sur les problèmes de logique et de sémantique". Mots de combat :)
Suresh Venkat Le

3
"La programmation fonctionnelle occulte les problèmes de conception d'algorithmes et de temps d'exécution et met l'accent sur les problèmes de logique et de sémantique." C'est pourquoi c'est un bon choix si vous travaillez du côté de la logique ou de la sémantique du TCS. :)
Radu GRIGore


3
@Sasho: Toutes les techniques ordinaires fonctionnent toujours dans des langages fonctionnels. Le seul "problème" est que la programmation fonctionnelle encourage un style de programmation et une conception de structure de données que les techniques ordinaires d'analyse algorithmique sont sous-équipés pour gérer. (Par exemple, quel est le point le plus important de la composition d'une fonction? L'opération est triviale , mais elle rompt complètement les hypothèses de complexité asymptotique - il n'existe pas de métrique numérique de taille simple pour une entrée fonctionnelle.)
Neel Krishnaswami

3
@SashoNikolov: Chaque fois que j'enseigne un cours sur les structures de données pour diplômés, j'aimerais vraiment pouvoir supposer que tout le monde a une certaine expérience de la programmation fonctionnelle. Au lieu de passer trois conférences de 90 minutes pour expliquer la persistance, je pourrais simplement dire: "Hé, avez-vous remarqué que vos structures de données le font déjà?"
Jeffε

33

Vous pouvez être un informaticien théorique assez performant sans programmation. Pour quelques personnes, programmer est assez difficile, et si vous en faites partie, vous ne devriez pas désespérer et changer de domaine.

Cependant, pour la plupart des étudiants diplômés en mathématiques et en informatique, apprendre à programmer n’est pas particulièrement difficile, c’est une compétence très utile. Vous devriez apprendre un langage de programmation, et si vous l’aimez bien, vous devriez essayer d’avoir suffisamment de pratique pour le maîtriser de manière raisonnable. Ensuite, lorsque le point venu (et il le sera) qu'il sera utile dans votre recherche d'écrire un programme, vous pourrez le faire.

Si vous n’apprenez pas à programmer maintenant, il est fort probable que lorsque vous aurez finalement besoin d’écrire un programme, vous n’aurez pas le temps d’apprendre et vous risquez donc de ne pas l’écrire. recherche. Il n’est pas si difficile de demander à un étudiant diplômé ou à un étudiant de premier cycle de le faire pour vous, mais il est souvent plus facile et moins fastidieux de le faire vous-même plutôt que de leur expliquer le problème.

Quelle langue devriez-vous apprendre? Je recommanderais un langage orienté objet, car ce sont ceux qui sont actuellement les plus utilisés, et je suppose que cela sera plus vrai à l'avenir. Peut-être que Python ou Java sont des langages orientés objet, et bien qu'ils soient moins utilisés en pratique que le C ++, j'ai l'impression qu'ils sont beaucoup plus faciles à apprendre. (Mise en garde: je ne connais pas le C ++, même si j'ai travaillé chez Bell Labs, alors je me trompe peut-être à ce sujet.)


2
Je vois la vérité dans votre troisième paragraphe :).
Gopi

1
"Cependant, pour la plupart des gens, apprendre à programmer n'est pas particulièrement difficile" - mon expérience m'amène à être en désaccord avec cela, mais la plupart des gens ne sont pas des chercheurs du SDC.
Max

2
Avec la montée en puissance de Sage, il est possible de travailler avec un joli langage populaire comme Python tout en maintenant des bibliothèques mathématiques de style Mathematica / Maple / Matlab disponibles instantanément.
András Salamon

1
C ++ possède le système de type / métaprogrammage le plus avancé de tous les langages de programmation grand public classiques que j'ai vus, à l'exception de la famille des langages Lisp. Donc, si vous êtes intéressé par la théorie des types, la conception de langage ou la théorie du compilateur, ou plus largement par la sémantique formelle, vous voudrez peut-être vous en familiariser. Outre C ++, Java et C # sont indispensables si vous souhaitez effectuer des recherches en informatique expérimentale ou si vous souhaitez obtenir un poste de programmeur ou d'ingénieur en logiciel dans le secteur. Python devrait être enseigné dans les écoles secondaires: D
Antonio Valerio Miceli-Barone

4
@ AntonioValerioMiceli-Barone: Je ne suis pas d'accord, du moins pour la théorie des types, la conception de langage, la sémantique formelle et la théorie du langage de programmation (PLT) en général: C ++ n'est pas le langage à apprendre pour ces domaines; TT et la sémantique formelle se rapportent presque exclusivement à la programmation fonctionnelle, alors que la communauté PL est plus diversifiée, mais préfère des langages plus élégants que C ++. Haskell est la langue "traditionnelle" avec le système de types le plus avancé, suivi de Scala (moins avancé, un peu plus traditionnel). C ++ a des fonctionnalités intéressantes, mais est trop bas pour le goût moderne.
Blaisorblade

33

Il y a une autre réponse que personne n'a vraiment évoquée. La programmation peut effectivement conduire à une théorie intéressante. Une grande partie des développements récents en hachage (en particulier la tabulation en tableau) ne sont pas motivés par des préoccupations théoriques en soi, mais par le fait que les algorithmes théoriquement optimaux ne sont pas si performants en pratique. Ceci est bien sûr quelque chose que vous ne savez pas sauf si vous pouvez écrire du code.

Même dans le domaine des algorithmes temporels exponentiels exacts, une motivation produit des algorithmes qui peuvent réellement fonctionner. Les solveurs SAT en sont l'exemple canonique.

En bref, la capacité de coder vous permet de comprendre les lacunes et les faiblesses de ce qui pourrait ressembler à des résultats théoriques optimaux, ce qui ouvre de nouvelles voies de recherche théorique.


Votre réponse pourrait peut-être aider sur la question des résultats empiriques dans TCS .
Gopi

peut-être: mais ce fil est éteint depuis longtemps :)
Suresh Venkat

En effet, je n’ai pas regardé la date, c’était dans le dernier bulletin que j’ai reçu, dans la section "Les plus grands hits des semaines précédentes" =).
Gopi

18

Trois points:

1) Il existe une approche mathématique appelée Mathématiques expérimentales (voir aussi wikipedia: // Preuve assistée par ordinateur ) qui consiste à utiliser des programmes informatiques pour rechercher des motifs et des structures d’objets afin de produire des preuves analytiques de ces objets. Pour cette approche, il vaut mieux savoir programmer. Vous pouvez être sûr que vous aurez besoin de cette approche pour prouver des affirmations très théoriques. Je crois que le snobisme contre la programmation s'avère souvent ne pas être vraiment utile dans la recherche sur le SDC.

UNEL(X,Y)BL(Y,C)

3) Quand vous dites "programmer", voulez-vous dire aussi " programme linéaire " ou " programme semi-défini "? :)


2
Je ne connais personne qui utilise "programmer" pour "programme linéaire" ou "programme semi-défini". Vous diriez plutôt "construire / résoudre un programme linéaire".
Peter Shor

2
@PeterShor Le point 3 n'était pas sérieux
Alessandro Cosentino Le

3
Et bien sûr, vous devriez également apprendre à programmer linéairement et à programmer semi-défini ... deux compétences utiles.
Peter Shor

3
+1 pour le point 2, on m'avait appris un peu OCaml quand j'étais étudiant, bien que je ne l'utilise que depuis un an, j'ai pris l'habitude de vérifier le type de mes épreuves.
Gopi

4
Je programme dynamiquement !
Jeffε

16

Merci Gopi pour cette question. J'aimerais élargir les nombreuses réponses intéressantes dans une autre dimension qui n'a pas encore été mentionnée.

La recherche n'est pas la seule chose que nous faisons à l'université: si vous souhaitez rester dans le monde universitaire, vous devrez éventuellement enseigner. Si vous avez de la chance, vous devrez enseigner des cours assez éloignés de votre domaine de spécialisation. Il est fort probable que vous recevrez des cours avec une composante de programmation importante. C’est là que même une capacité modérée de programmer aide considérablement: vous serez bien meilleur enseignant si vous savez programmer. D'abord et avant tout, vous serez plus à l'aise avec le matériel, vous pourrez mieux répondre aux questions des étudiants et vous comprendrez les difficultés que rencontrent les étudiants pour apprendre à programmer, alors que vous avez expérimenté vous-même ce processus d'apprentissage. De plus, vous pouvez produire un meilleur matériel pédagogique. Par exemple, vous pouvez tester vous-même des exercices de programmation avant de les donner aux étudiants,

Il existe une autre dimension pragmatique: l’enseignement implique diverses tâches répétitives qu’un programmeur expérimenté peut souvent automatiser, comme la création rapide d’un site Web que les étudiants peuvent utiliser pour soumettre des travaux de cours et les faire noter automatiquement (en fonction du nombre de tests automatisés que le code passe).


«Si vous avez de la chance, vous devrez enseigner des cours assez éloignés de votre domaine de spécialisation.» Est-ce que c'est de la chance…?
Tsuyoshi Ito

3
@ Tsuyoshi: Eh bien, cela vous oblige à vous familiariser avec un nouveau domaine. À court terme, cela représente beaucoup de travail (qui s’amortit à long terme, car vous aurez probablement à enseigner ce matériel plus d’une fois). En même temps, cela élargit considérablement vos horizons intellectuels.
Martin Berger

@TsuyoshiIto: Oui!
Jeffε

13

La programmation est un bon moyen d’améliorer votre compréhension de divers concepts, mais c’est aussi un gouffre temporel dangereux.

Un argument typique contre la programmation est que cela vous oblige à passer du temps avec des détails sans importance. Un argument typique de la programmation est que cela vous fait réaliser que les détails que vous pensiez sans importance sont en réalité importants. Pour devenir bon en programmation, il faut principalement être capable de gérer rapidement les parties non importantes. Devenir bon prend beaucoup de temps.

En ce qui concerne le langage de programmation à apprendre: "tous" est ma réponse (langue dans la joue).


2
Enfin un argument contre la programmation :).
Gopi

1
@ Gopi, je pense que la programmation peut être très amusante et qu'il est très important de mieux comprendre. Les autres réponses donnent de bons exemples de la façon dont la programmation aide à la compréhension. Je vous encourage donc à apprendre la programmation et à ne pas abandonner si l'entreprise ne semble pas porter ses fruits rapidement.
Radu GRIGore

6
Prouver des théorèmes est également un bon moyen d’améliorer votre compréhension de divers concepts, mais c’est aussi un puits de temps dangereux.
Jeffε

@ Jɛ ff E, mon opinion est préservée par la substitution [pseudocode-> preuve sur papier, code-> preuve dans un assistant de preuve].
Radu GRIGore

12

Je suis en retard à la fête, et ce sont toutes d'excellentes réponses, mais j'ai une autre raison:

Visualisation.

Oui, vous travaillerez souvent avec des choses qui ne peuvent pas être visualisées, mais vous travaillerez souvent avec des choses qui peuvent. Savoir programmer est indispensable pour cette tâche et la visualisation peut vous aider à mieux comprendre un problème.


3
Je sais programmer et je suis absolument sans espoir en visualisation. Je soupçonne également qu’il existe des outils qui vous permettront de visualiser des choses sans beaucoup de programmation; s'il n'y en a pas, il devrait y en avoir et peut-être dans quelques années.
Peter Shor

@PeterShor: Parce que vous n'utilisez pas le C ++! (Je plaisante)
Tsuyoshi Ito

1
@PeterShor: Je ne fais référence à aucun langage ou environnement spécifique; MATLAB compte ici. Mais savoir programmer vous permet d’obtenir des visualisations qui seraient autrement extrêmement gênantes. Par exemple, l'espace des matrices à deux dimensions définies positivement est tridimensionnel et je voulais visualiser une famille de constructions dans cet espace. Je devais trouver une transformation, puis la coder pour voir vraiment mes objets.
John Moeller

@ John ... tu as raison, je ne pense pas que tu aurais pu le faire autrement.
Peter Shor

7

Juste un petit point: savoir programmer me donne un outil supplémentaire dans la recherche théorique. Lorsque j’ai un algorithme qui, à mon avis, fonctionnera, s’il est assez facile, je pourrais le coder et vérifier si c’est le cas. Si mon idée ne fonctionne pas (même) dans la pratique, elle ne fonctionnera probablement pas très bien en théorie, et cette approche m'évite souvent de perdre énormément de temps à essayer de prouver que quelque chose est faux.


Tsuyoshi Ito a écrit un argument similaire dans sa réponse (deuxième point :)).
Gopi

Oups tu as raison - ça m'a manqué.
Lev Reyzin

5

Personne ici n’a abordé les questions pratiques de savoir pourquoi une personne qui étudie le SDC devrait apprendre à programmer.

Si vous envisagez de faire un doctorat en SDC dans un département d'informatique, il y a de fortes chances que vous ayez à suivre des cours non théoriques, qui nécessiteront presque certainement beaucoup de programmation. Selon le programme dans lequel vous vous inscrivez, vous devrez peut-être également connaître des matières non théoriques pour réussir vos examens de qualification.

Lorsque vous terminez votre doctorat, la plupart des possibilités d’emploi pour TCS sont dans le monde universitaire. Si vous travaillez dans le monde universitaire, on vous demandera d'enseigner, et d'enseigner un cours de niveau CS pour les étudiants de premier cycle de niveau intro qui sera plus programmé que théorique. Même si vous donnez un cours théorique aux étudiants de premier cycle, comme par exemple Algorithmes, vous pouvez vous attendre à ce que vos étudiants en sachent plus sur la programmation que sur la théorie, et sans savoir ce que vos étudiants savent, il vous sera difficile de réduire l'écart de compréhension. . Je frémis à l'idée d'enseigner aux étudiants de premier cycle en CS par quelqu'un qui ne connaît pas la programmation!

Si vous ne vous souciez pas de ces problèmes pratiques, alors vous pouvez probablement faire de la recherche sans vraiment rien savoir de la programmation. Certes, vous avez beaucoup de contacts dans la communauté TCS, mais le kilométrage variera en fonction du domaine exact de la théorie dans lequel vous travaillez. Par exemple, si vous faites de la théorie de la complexité calculatoire pure, établissez des limites inférieures à des classes que personne n'a jamais. jamais entendu parler de, alors il est probable que la programmation ne sera d'aucune utilité pour vous. Mais si vous faites quelque chose de plus algorithmique, alors j’estime qu’être capable d’écrire un bon code de travail propre renforcera votre intuition, si rien d’autre.

Je recommande d'apprendre le C (pas le C ++). Prenez une copie de K & R et lisez-la en avant. C n'a pas beaucoup de fonctionnalités sophistiquées des langues modernes, mais il a une syntaxe et une sémantique simples mais élégantes, que vous devriez pouvoir apprendre dans leur intégralité. Cependant, même lorsque vous comprenez le langage dans son intégralité, il vous faut encore de la pratique pour écrire de bons codes élégants et sans bug dans le langage C. Néanmoins, si vous maîtrisez le codage en C, vous pourrez maîtriser tous les langages de programmation que vous rencontrez. De plus, cette discipline vous aidera à réfléchir à la pensée du matériel, ce qui sera bénéfique lors de la conception d'algorithmes.

Les idées comme les pointeurs sont très importantes pour quiconque conçoit des algorithmes, mais malheureusement, des langages comme Java et Python vous les masquent, c'est pourquoi je ne les recommande pas en tant que première langue à une personne ayant une formation en mathématiques. La POO est plus importante pour les personnes qui doivent gérer des projets logiciels volumineux, et non pour ceux qui conçoivent des algorithmes.


0

Je vous suggérerais de ne pas attendre le début de votre cours, car l’informatique implique à tout niveau de mettre en œuvre des algorithmes sur ordinateur afin de réaliser / vérifier / résoudre toute théorie à laquelle vous devrez faire face tout au long de votre cours, NOTAMMENT à votre niveau.

Je devais commencer par programmer en 10e année (secondaire) et je savais déjà comment utiliser une ligne de commande, ce qui m'a vraiment aidé (c'est pour vous montrer comment les compétences de base en programmation sont prises en compte dans CS).

L'étonnement de vos pairs est bien fondé, car le pseudocode et les algorithmes sont parmi les premières choses à apprendre pour programmer.

Cependant, vous ne devez pas vous perdre complètement dans votre prochain cours, car vous pouvez utiliser vos compétences mathématiques plus larges (à votre guise) à votre avantage pour sauter la programmation orientée objet afin de rattraper plus rapidement votre retard en apprenant un langage de programmation fonctionnel.

  • La programmation fonctionnelle est TRÈS orientée vers les mathématiques, considérée comme difficile à apprendre car elle possède les connaissances requises en mathématiques, et très puissante (méthode "simple" et mathématique permettant de résoudre des problèmes complexes par des moyens élégants et "propres").
  • L'orientation objet est utile lorsque vous ne souhaitez pas comprendre les algorithmes sous-jacents et les principes d'implémentation et souhaitez simplement "réutiliser" des objets déjà existants.

Je pense que vous pourriez vous attaquer à Haskell (généralement pas une langue maternelle) car il est purement mathématique, fonctionnel et peut faire pratiquement tout ce que vous voulez. Apprendre Haskell vous placerait à un niveau où vous n’auriez pas besoin d’apprendre beaucoup plus pour suivre, et vous mettrait même dans une situation de contrôle et de pouvoir sur votre parcours. Si vous aimez les statistiques, apprendre R est un plus, mais pas autant que Haskell. J'ai vu des rapports de mathématiciens affirmant à quel point ils étaient surpris de sa proximité avec les mathématiques et de la manière dont cela reflétait leur façon de penser.

En outre, un défi qui mérite d'être relevé (pour vous habituer rapidement à un environnement de programmation) serait d'installer et d'utiliser Linux (Ubuntu Linux fera l'affaire). Croyez-moi, vous apprendrez beaucoup en jouant avec elle ...

Ces conseils sont le meilleur moyen que je connaisse pour rattraper rapidement et sûrement un mathématicien en informatique. De plus, la communauté open source est très amicale et utile, et si vous êtes bloqué, IRC est le moyen le plus direct de parler de n'importe quel sujet via des canaux spécialisés (connectez-vous sur FreeNode). Rappelez-vous: poser des questions est le seul moyen de résoudre des questions, que ce soit pour vous-même, pour un forum, un moteur de recherche ou des salons de discussion.


4
Je ne sais pas à quel point vous répondez à la question initiale: je n'ai pas demandé "comment faire", mais plutôt "pourquoi faire".
Gopi

0

Le document suivant est un exemple d'implémentation C ++ d'un système de preuve interactif: preuves interactives optimales pour l'évaluation de circuits, par Justin Thaler. Il est disponible sur http://people.seas.harvard.edu/~jthaler/ . Cela semble être un pas en avant vers l’objectif de développement d’une implémentation pratique de systèmes de preuve interactifs à usage général.

Des articles similaires et des codes sources apparentés figurent sur le site Web mentionné ci-dessus.


3
Pourriez-vous expliquer en quoi ce document est lié à la question suivante: quelle est l'importance de savoir comment programmer pour le SDC ?
Scaaahu

Même s’il s’agissait d’un exemple de résultat théorique bénéficiant de la programmation, cela ne répondrait-il pas à la question initiale?
Jeremy

La question demande s'il est nécessaire qu'un théoricien de la complexité connaisse le codage. Le document mentionné ci-dessus utilise clairement les résultats expérimentaux pour compléter les concepts théoriques; cela nécessite un codage. En tout état de cause, il m'a fallu très longtemps pour trouver un projet de programmation qui soit si étroitement lié à un concept central en informatique théorique. J'espère que ce post pourrait être utile à quelqu'un sur une recherche similaire.
lgidwani
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.