Niveaux de base:
Regardons les choses au niveau le plus simple et le plus fondamental.
Pour les maths, on a:
2 + 3 = 5
J'ai appris cela très tôt. Je peux regarder les éléments les plus fondamentaux: deux objets et trois objets. Génial.
Pour la programmation informatique, la plupart des gens ont tendance à utiliser un langage de haut niveau. Certains langages de haut niveau peuvent même "compiler" dans l'un des langages de bas niveau les plus bas, comme le C. Le C peut ensuite être traduit en langage Assembly. Le langage d'assemblage est ensuite converti en code machine. Beaucoup de gens pensent que la complexité s'arrête là, mais ce n'est pas le cas: les CPU modernes prennent le code machine sous forme d'instructions, mais exécutent ensuite un "micro code" pour exécuter ces instructions.
Cela signifie qu'au niveau le plus élémentaire (traitant des structures les plus simples), nous traitons maintenant du micro-code, qui est incorporé dans le matériel et que la plupart des programmeurs n'utilisent même pas directement, ni ne mettent à jour. En fait, non seulement la plupart des programmeurs ne touchent pas le micro-code (0 niveau supérieur au micro-code), la plupart des programmeurs ne touchent pas le code machine (1 niveau supérieur au micro-code), ni même Assembly (2 niveaux supérieurs au micro-code) ( sauf peut-être pour un peu de formation formelle au collège). La plupart des programmeurs ne passeront plus que trois niveaux ou plus.
En outre, si nous examinons le niveau d’assemblée (le niveau le plus bas généralement atteint par les utilisateurs), chaque étape est compréhensible pour les personnes formées et disposant des ressources nécessaires pour l’interpréter. En ce sens, l'Assemblée est beaucoup plus simple qu'un langage de niveau supérieur. Cependant, Assembly est si simple que la réalisation de tâches complexes, voire médiocres, est très fastidieuse. Les langues de niveau supérieur nous libèrent de cela.
Dans une loi sur le "reverse engineering", un juge a déclaré que, même si le code peut en théorie être traité octet par octet, les programmes modernes impliquent des millions d'octets. un effort pour être réalisable. (Par conséquent, le développement interne n'était pas considéré comme une violation de la règle générale du "copyright de ne pas faire de copies" du droit d'auteur). )
Modernisation:
Vous exécutez du code destiné à 286? Ou utilisez-vous du code 64 bits?
Les mathématiques utilisent des principes fondamentaux qui remontent à des millénaires. Avec les ordinateurs, les gens considèrent généralement que l’investissement dans quelque chose de plus de deux décennies gaspille inutilement des ressources. Cela signifie que les mathématiques peuvent être testées de manière beaucoup plus approfondie.
Normes d'outils utilisés:
On m'a appris (de la part d'un ami ayant une formation en programmation informatique plus formelle que moi) qu'il n'existait pas de compilateur C exempt de bogues répondant aux spécifications C. En effet, le langage C suppose la possibilité d'utiliser une mémoire infinie pour les besoins d'une pile. De toute évidence, une telle exigence impossible a dû être écartée lorsque les gens ont essayé de créer des compilateurs utilisables qui fonctionnent avec des machines réelles, de nature un peu plus finie.
En pratique, j'ai constaté qu'avec JScript dans Windows Script Host, j'ai été capable de réaliser beaucoup de bonnes choses à l'aide d'objets. (J'aime l'environnement, car les outils nécessaires pour essayer du nouveau code sont intégrés aux versions modernes de Microsoft Windows.) Lors de l'utilisation de cet environnement, j'ai constaté qu'il n'existait parfois pas de documentation facile à trouver sur le fonctionnement de l'objet. Cependant, utiliser l'objet est tellement bénéfique que je le fais quand même. Donc, ce que je ferais, c’est écrire du code, ce qui peut être un bug pour un nid de frelons, et le faire dans un environnement bien mis en sandbox où je peux voir les effets et apprendre les comportements de l’objet lorsqu’il interagit avec lui.
Dans d'autres cas, parfois seulement après avoir compris le comportement d'un objet, j'ai constaté que celui-ci (fourni avec le système d'exploitation) présentait un bogue et qu'il s'agissait d'un problème connu que Microsoft a décidé de ne pas résoudre intentionnellement. .
Dans de tels scénarios, est-ce que je me fie à OpenBSD, créé par des programmeurs talentueux qui créent régulièrement de nouvelles versions (deux fois par an), avec un fameux dossier de sécurité de "seulement deux trous distants" sur 10 ans ou plus? (Même s'ils ont des correctifs d'errata pour des problèmes moins graves.) Non, en aucun cas. Je ne compte pas sur un tel produit de qualité aussi élevée, car je travaille pour une entreprise qui prend en charge les entreprises qui fournissent aux utilisateurs des machines utilisant Microsoft Windows. C'est pourquoi mon code doit fonctionner.
La praticité / la facilité d'utilisation exigent que je travaille sur les plates-formes que les utilisateurs trouvent utiles, c'est une plate-forme réputée mauvaise pour la sécurité (même si d'énormes améliorations ont été apportées depuis le début du millénaire et que les produits de la même société étaient bien pires) .
Sommaire
Il y a de nombreuses raisons pour lesquelles la programmation informatique est plus sujette aux erreurs, et cela est accepté par la communauté des utilisateurs d’ordinateurs. En fait, la plupart du code est écrit dans des environnements qui ne tolèrent pas les efforts sans erreur. (Certaines exceptions, telles que l'élaboration de protocoles de sécurité, peuvent nécessiter un peu plus d'effort à cet égard.) Outre les raisons couramment invoquées par les entreprises pour ne pas investir davantage, et le non-respect de délais artificiels pour rendre les clients satisfaits, l'impact de la marche de la technologie qui indique simplement que si vous passez trop de temps, vous travaillerez sur une plate-forme obsolète, car les choses changent de manière significative au cours d'une décennie.
De prime abord, je me souviens avoir été surpris de voir à quel point certaines fonctions très utiles et populaires étaient courtes, lorsque j’ai vu du code source pour strlen et strcpy. Par exemple, strlen peut avoir ressemblé à "int strlen (char * x) {char y = x; while ( (y ++))); return (yx) -1;}"
Cependant, les programmes informatiques typiques sont beaucoup plus longs que cela. En outre, beaucoup de programmes modernes utiliseront un autre code qui pourrait être moins bien testé ou même connu pour être bogué. Les systèmes actuels sont beaucoup plus élaborés que ce qui peut être facilement pensé, sauf en écartant à la main une grande partie de la minutie en tant que "détails traités par des niveaux inférieurs".
Cette complexité obligatoire et la certitude de travailler avec des systèmes complexes, voire erronés, font de la programmation informatique un matériel à vérifier bien plus qu’un grand nombre de mathématiques où les choses ont tendance à se résumer à des niveaux beaucoup plus simples.
Lorsque vous décomposez en mathématiques, vous obtenez des éléments individuels que les enfants peuvent comprendre. La plupart des gens font confiance aux mathématiques; au moins l'arithmétique de base (ou, au moins, compter).
Lorsque vous interrompez vraiment la programmation informatique pour voir ce qui se passe sous le capot, vous vous retrouvez avec des implémentations défectueuses de codes et de codes enfreints exécutés électroniquement, et cette implémentation physique est juste une étape en dessous du microcode dont la plupart des informaticiens formés à l'université n'osez pas toucher (s'ils en sont même conscients).
J'ai parlé à des programmeurs qui sont à l'université ou à des diplômés récents qui s'opposent carrément à l'idée qu'il est possible d'écrire du code sans bug. Ils ont écarté cette possibilité, et bien qu’ils reconnaissent que certains exemples impressionnants (que j’ai pu montrer) sont des arguments convaincants, ils considèrent ces échantillons comme des exemples rares et non représentatifs, tout en écartant la possibilité de pouvoir compter. d'avoir de telles normes plus élevées. (Une attitude très différente de la base beaucoup plus fiable que nous voyons en mathématiques.)