Je me retrouve constamment dans cette expression "ne réinvente pas la roue" ou "ne réinvente jamais la roue" quand je pose des questions sur SO. Ils vous disent d'utiliser certains frameworks ou packages existants. Je sais d'où vient cette attitude car il est imprudent de perdre du temps sur quelque chose que d'autres ont déjà résolu. Ou c'est ça?
En tant qu'étudiant, je trouve qu'en utilisant du code que d'autres ont écrit pour résoudre mon problème, je ne peux pas apprendre autant que je le voudrais, et j'ai moins de connaissances. Et parfois, je pense que cette phrase s'adresse principalement aux programmeurs qui font face à des délais et non aux étudiants comme moi.
Est-ce si mauvais de "réinventer la roue"? Peut-être que je pense que c'est mal? Peut-être qu'il y a un moyen d'éviter de réinventer la roue et en même temps d'apprendre beaucoup de choses?
Je pense que vous faites valoir un bon argument. La plupart des programmeurs sur ce site sont probablement des professionnels actifs dont l'objectif est à peu près de créer des logiciels de qualité le plus rapidement possible. Réinventer la roue échoue à deux égards.
Cela dit, dans un environnement académique, l'objectif est de apprendre, pas de fournir des logiciels avec un budget limité. Réinventer une roue pour comprendre le fonctionnement des rayons ou des essieux est un excellent moyen d'atteindre cet objectif. C'est pourquoi de nombreux programmes de programmation incluent une classe sur la construction de compilateurs alors que très peu de programmeurs qui travaillent ont jamais besoin de le faire.
La réponse dépend beaucoup du contexte. Si vous souhaitez acquérir une compréhension plus approfondie des structures de données en essayant de mettre en œuvre une table de hachage, "réinventer la roue" est la meilleure chose que vous puissiez faire. Si vous apprenez à écrire des compilateurs et avez besoin d'une table des symboles, implémenter votre propre carte de hachage au lieu d'en réutiliser une à partir de la bibliothèque standard est une perte de temps totale.
En tant qu'étudiant, je m'attends à ce que vous commenciez votre formation en programmation en copiant d'abord une roue ou deux pour commencer, puis en apprenant à modifier roues pour voir comment elles fonctionnent et comprendre les limitations. Plus tard, vous pourriez même créer une toute nouvelle roue pour voir si vous pouvez améliorer la conception ou pour montrer à votre superviseur de cours votre compréhension de la concepts impliqués.
Cependant, en tant que professionnel, je m'attendrais à ce que vous ayez appris quelle roue utiliser pour résoudre un problème donné et quand il pourrait être approprié de modifier un roue existante si elle ne résout que partiellement votre problème. Si vous ne trouvez pas de roue n'importe où, alors vous avez peut-être identifié un créneau de marché, ou vous n'avez pas suffisamment exploré, et vous devrez être suffisamment expérimenté pour savoir quand il serait approprié de créer votre propre roue .
La question de savoir quand il convient de réinventer une solution est complexe, et cela demande du temps et de l'expérience pour savoir quand il serait préférable de créer une toute nouvelle version de quelque chose qui a déjà été fait auparavant. Lorsque vous ne développez que depuis peu de temps, il est préférable d'utiliser simplement une solution existante et de demander à vos mentors de suggérer des options. Lorsque vous avez des délais serrés et beaucoup d'incertitude dans un projet, l'utilisation de quelque chose d'existant peut être un énorme gain de temps et est toujours votre premier choix. Vous pouvez toujours refactoriser pour utiliser d'autres solutions plus tard si cela est approprié, même si cela signifie éventuellement revenir pour réinventer votre roue .
Étant enseignant ou programmeur, je me bats constamment avec le côté opposé du problème: quand dois-je demander aux élèves de réinventer la roue?
Prenons ces situations simples: nous étudions un algorithme de tri et je définis des tâches pour écrire un programme qui trie certaines données; ou travailler sur la fonctionnalité de date, et je demande un calendrier.
Pour les deux, il existe d'innombrables bibliothèques et fonctionnalités prêtes à l'emploi disponibles; mais je veux que les étudiants les évitent et développent leur propre version d'un algorithme de tri ou d'un calendrier.
Maintenant, prenez cette autre: j'ai défini une tâche pour écrire une application simple pour, disons, planifier des rendez-vous. Cela nécessitera probablement un tri, un calendrier, etc. Cette fois, "ne réinventez pas la roue" s'applique: je ne veux pas que les élèves aient du mal à résoudre les problèmes, mais plutôt assembler les fonctionnalités existantes pour obtenir un résultat.
Ma difficulté est de savoir combien vous demander de recréer l'existant, ce qui vous permet d'apprendre, et a l'avantage de problèmes bien maîtrisés avec des difficultés connues que je peux utiliser pour vous faire pratiquer le métier, et combien je dois placer vous dans un environnement réel, où les roues ne se réinventent pas?
Pour répondre plus directement à votre question, deux suggestions:
Pratique Je doute que les 1000 premières lignes de code écrites par quelqu'un soient très uniques.
Développez votre ensemble d'outils L'utilisation d'un framework a plus d'avantages lorsque vous comprenez ce qu'il fait (au point que vous pourriez le faire vous-même.) Afin que vous sachiez comment l'appliquer.
Comprendre les "roues" Utiliser une roue mal construite et usée ou qui ne rentre pas, n'est pas une excuse pour s'en tenir aveuglément à cette règle empirique. Vous pouvez manquer de temps, de financement, d'expertise, alors il vous suffit de rafistoler et de terminer le voyage.
Il y a peu d'absol.
Les étudiants n'ont pas de budget pour terminer leurs devoirs, mais il y a des dates limites à considérer.
En tant qu'étudiant jusqu'à récemment, je pense que la quantité de roue à réinventer qui est appropriée dépend de la classe pour laquelle vous faites le devoir. Vous ne voulez pas écrire votre propre bibliothèque de socket pour une classe de développement et de conception Web (si vous pouvez le faire et activez l'affectation à temps, que faites-vous en prenant une classe aussi facilement?) , mais il vous manquerait beaucoup s'il s'agissait d'une affectation pour une classe réseaux. Bien sûr, les professeurs tiennent généralement compte de ces choses lorsqu'ils créent des devoirs, donc vous ferez principalement du travail lié à la classe, mais parfois, sachant ce que vous ne devriez pas vous écrire est important aussi.
Cela dit, une fois que vous quittez l'école, il est difficile de trouver le temps de construire des choses qui existent déjà. Saisissez toutes les occasions que vous obtenez lorsque vous le pouvez, pendant que vous êtes encore à l'école.
Si vous obtenez le pinceau "Utiliser la bibliothèque X/framework Y" sur SO, faites précéder votre question par "J'écris X par moi-même pour en savoir plus"
Si vous n'avez pas de date limite pour votre projet, OMI, il vaut mieux réinventer la roue. Si vous n'avez pas de travail, ou si vous cherchez simplement à apprendre à programmer, pas à faire de la programmation en argent, quel est l'intérêt d'utiliser des raccourcis qui ne feront pas de vous un meilleur programmeur, ceux qui le feront faites-vous simplement réaliser votre projet plus rapidement? Bien que cela soit vrai, c'est certainement une bonne compétence pour savoir comment utiliser les bibliothèques, les frameworks et le code d'autres personnes.
Je suis un étudiant nouvellement instruit. Dans l'école que nous "apprenions" asp.net et C #, ces 2 années d'enseignement, nous n'avons jamais essayé de créer notre propre système de messagerie, système de connexion ou CMS. Tout était simplement en train de glisser et de laisser le contrôle dans la vue de conception .
Nous avons commencé 102 étudiants, 23 l'ont terminé. 4 personnes ont un travail. La raison?: Ces 4 personnes (dont moi) savaient comment programmer avant de commencer l'éducation.
Le reste du peuple est perdu. Parce que nous n'avons jamais "réinventé la roue". Nous n'avons jamais su comment le code fonctionne réellement. Il est assez simple de créer un système de connexion complet, avec gestion des utilisateurs - Mais les étudiants de mon éducation ne savent pas comment le faire. Parce qu'ils ne savent pas comment fonctionne réellement un système de connexion.
Je me sens triste, à un moment donné, en fait perdu 2 ans, rien à apprendre. - Je souhaite que les enseignants du monde entier disent: Oui, nous savons qu'il existe des cadres, où le code existe, vous pouvez les utiliser dans la vraie vie .. Mais sur cette éducation, vous apprendrez à faire de la programmation ..
De nombreuses formations en programmation sont très courtes, de sorte que les formations doivent couvrir beaucoup de choses au cours de cette période. Je pense qu'il vaudrait mieux que la liste des choses soit réduite de moitié et consacrer plus de temps à la programmation. Les gens peuvent "inventer un nouveau type de roue" s'ils savent comment construire une "roue" normale. Les gens ne sont pas stupides s'ils ont un peu de connaissances, mais vous ne pouvez pas demander à un homme qui ne sait rien des voitures de construire une voiture. Mais demander à un homme qui sait construire un vélo aurait beaucoup plus de facilité avec la construction de la voiture.
Dans la vraie vie, la roue se réinvente encore et encore. Si nous cherchons les raisons, nous pourrions trouver un aperçu de la nécessité de réinventer la roue dans la programmation.
Depuis l'époque sumérienne, beaucoup de choses ont changé:
Comment cela se traduit-il dans le monde du logiciel? Bien,
La réponse dépend de si vous souhaitez apprendre ou créer.
Si l'apprentissage est l'objectif, "réinventer la roue" peut vous donner une meilleure compréhension et une meilleure compréhension que l'utilisation des roues existantes (fonctions de bibliothèque).
Mais si l'objectif est de créer un produit compliqué, "réinventer la roue" peut être une pratique longue et n'aidera guère la création du produit.
Néanmoins, si l'objectif de l'âme est d'apprendre avec suffisamment de temps et d'endurance, "réinventer la roue" est la meilleure option, car elle permet de personnaliser chaque fonctionnalité.
Cela dépend vraiment de ce que vous faites. Si vous essayez de comprendre les roues, c'est une bonne idée de les réinventer vous-même. Si toutefois vous essayez de comprendre les voitures, réinventer la roue ou les moteurs à combustion interne est généralement inutile et distrayant.
Ainsi, par exemple, lorsque vous souhaitez comprendre comment un index de recherche plein texte peut fonctionner, c'est une bonne idée d'essayer de lancer le vôtre. Si vous essayez de créer une application pour la gestion de documents, il est préférable de réutiliser une bibliothèque existante, car la plupart de votre travail consiste à obtenir l'architecture de l'application et l'expérience utilisateur en même temps.
Oui, il convient de dire aux élèves de ne pas réinventer la roue. Mais il doit y avoir une compréhension claire de ce que cela signifie pour un étudiant: écrivez ce qui est pertinent à la tâche. Cela ne signifie pas que si la tâche consiste à écrire unort de bulles, vous le copiez hors de Wikipédia, cela ne signifie pas non plus d'utiliser array.sort ou des équivalents si votre framework ou votre langage le fournit. Mais après avoir couvert les différents algorithmes de tri, écrit votre propre tri de bulles et tri rapide, ne vous embêtez pas à le réécrire pour chaque nouvelle affectation, utilisez le tri intégré ou ce que vous avez écrit, ne recommencez pas la même chose .
Réinventer la roue, c'est ne pas perdre de temps, ce qui s'applique aussi bien aux étudiants qu'aux professionnels - la différence réside dans les objectifs. Les étudiants devraient apprendre, donc quelque chose qui ne fait pas progresser leur compréhension est une perte de temps - après avoir écrit une bulle, vous savez ce qu'elle fait, vous savez pourquoi vous ne voulez pas l'utiliser sur un grand ensemble, et le réécrire encore et encore est une perte de temps. Vous n'allez rien apprendre de nouveau lors de la 25e réécriture.
Pour les étudiants, cela ne signifie pas ne pas écrire ce que les autres ont écrit, cela signifie ne pas refaire ce que vous avez déjà maîtrisé - ce temps qui pourrait être mieux consacré à ce que vous n'avez pas maîtrisé.
Beaucoup de pensées et d'efforts ont été consacrés à la création d'une roue. Le conseil est de "ne pas réinventer la roue" mais vous pouvez aller de l'avant et procéder à une rétro-ingénierie de la roue et comprendre pourquoi certaines choses se font de la façon dont elles sont faites. Après cela, vous pouvez essayer d'implémenter la roue à votre manière, ce qui pourrait entraîner l'une des trois fins logiques.
Pour moi, les étudiants ne devraient pas réinventer la roue, mais essayer de la désosser et de comprendre les implications.
Je dirais que cela dépend si vous réinventez pour voir comment fonctionne la roue ou réinventez la roue en train d'accomplir une autre tâche. Il y a certainement des roues que chaque élève doit mettre en œuvre au moins une fois par lui-même. Vous devez savoir comment certaines structures de données élémentaires et certains algorithmes fonctionnent afin de comprendre comment ils affecteront les performances de votre code ou choisir ceux à utiliser dans diverses circonstances.
Les piles, les tas, les listes liées, les arbres, etc. valent vraiment l'investissement en temps à mettre en œuvre une fois; puis utilisez toujours ceux fournis par le framework. Tous ceux qui utilisent un plugin jQuery doivent en écrire au moins un, mais vous n'avez pas besoin d'en écrire tous les types que vous utiliserez. Je dirais qu'il est utile, mais pas nécessaire, d'écrire un petit planificateur de processus ou un mini-OS afin que vous puissiez comprendre ce qui se passe sous le capot sur un ordinateur. Cependant, vous devez comprendre comment fonctionnent les processus, les threads, etc.
Une fois que vous avez une bonne connaissance pratique, il peut également être important (et amusant) de revenir en arrière et de mettre en œuvre de nouvelles structures/algorithmes pour les ressentir. À moins que ce soit votre travail ou que vous soyez vraiment bon dans ce domaine, je m'en tiendrai à l'utilisation de ceux existants dans votre code.
Eh bien, il y a deux aspects à cela.
Premièrement, si vous essayez d'apprendre, il peut être utile de faire certaines choses à partir de zéro, ou d'utiliser des interfaces de niveau inférieur à ce qui est nécessaire. Cependant, il est toujours nécessaire d'identifier ce que vous apprenez: si vous voulez en savoir plus sur le protocole HTTP, vous n'avez pas besoin de faire la programmation des sockets vous-même. Réinventez seulement les choses que vous apprenez, et faites-le seulement pour vraiment les explorer et les comprendre.
Mais - l'une des compétences les plus importantes d'un programmeur professionnel est de sélectionner, d'apprendre et d'utiliser des logiciels préexistants. C'est quelque chose que vous devez également apprendre. Une énorme proportion des questions sur SO semblent provenir de personnes incapables de lire la documentation.
Enfin, la programmation repose sur une base théorique substantielle. Vous devrez utiliser les deux exercices pratiques, couplés à la lecture, pour apprendre la théorie.
J'ai fait face à la même situation. C'est à cause de la différence de perception dans l'industrie et les universitaires.
Si vous ne "réinventez pas la roue", vous ne pouvez absolument pas étudier quoi que ce soit à l'école ou comprendre comment quelque chose fonctionne.
Alors que dans une industrie, l'objectif est de faire ressortir un produit en moins de temps et d'efforts.
Personnellement, j'aime descendre le terrier du lapin et je déteste la philosophie de l'industrie mais c'est comme ça que les affaires se font et on ne peut pas se plaindre.
Le Hacker Jargon Lexikon a un très bon commentaire sur réinventer la roue :
Concevoir ou mettre en œuvre un outil équivalent à un ou une partie d'un outil existant, avec l'implication que le faire est idiot ou une perte de temps. C'est souvent une critique valable. D'un autre côté, les automobiles n'utilisent pas de rouleaux en bois, et certains types de roues doivent être réinventés plusieurs fois avant de les corriger. D'un autre côté, les personnes qui réinventent la roue ont tendance à trouver l'équivalent moral d'un trapèze à essieu décalé.
Il peut donc être bon de réinventer la roue, mais assurez-vous de regarder les solutions des autres avant ou après l'avoir fait.
Réponse A: Réinventez la roue. Il approfondit votre compréhension des structures de données et des algorithmes et rend beaucoup plus probable que vous écriviez de bonnes choses. Je suis sûr que lorsque Guido van Rossum a commencé sur Python, les gens lui ont dit de ne pas réinventer la roue. Il y avait déjà beaucoup de langues. Pourquoi écrire à Google alors qu'il y avait déjà Yahoo! Que diriez-vous de clang? Apprenez tout. Soyez un géant. Ne laissez pas les petites personnes vous limiter. Réponse B: Si un instructeur vous dit quoi faire, donnez-lui ce qu'il veut, ou juste un peu plus même si cela semble idiot. Si vous voulez également devenir fou en faisant une solution étonnante et lui donner un lien, allez-y. Tout d'abord, cependant, remplissez les conditions énoncées comme indiqué afin qu'il soit heureux.