Si vous êtes programmeur, ne vous considérez pas comme un "informaticien"; les informaticiens sont ceux qui créent la prochaine génération d'ordinateurs, dont certains sont encore de la science-fiction jusqu'à ce que le bon mélange de matériaux, la miniatuisation et la théorie computationnelle soient dérivés. Ils ne sont que le début du pipeline. Les personnes qui développent des logiciels ici et maintenant sont des "ingénieurs logiciels"; ils prennent les théories et les outils, parfois en superposant la théorie pratique et des outils du monde réel, pour exploiter le pouvoir en puissance de cette pièce complexe de la magie électroinique et le faire faire ce que nous voulons. Il s'agit à son tour d'une spécialisation du domaine de "l'ingénierie informatique", qui reprend les théories des informaticiens et les applique, matériel et logiciel, aux solutions électroniques des utilisateurs finaux du monde réel.
C'est à l'OMI que le monde des affaires rencontre la théorie. Dans ces types de cas, le vieil adage "l'ennemi du mieux est assez bon" peut facilement être inversé pour se lire "l'ennemi du bien est mieux". Le fait de vous considérer comme un "ingénieur" au lieu d'un "scientifique" et de mettre ce que vous faites en parallèle avec d'autres disciplines de l'ingénierie met en relief les différences.
Disons qu'un client vient à vous, un ingénieur civil / structure, et vous demande de construire un pont. Le pont doit s'étendre sur 20 pieds, se soutenir et supporter une tonne de charge, il devrait durer 10 ans avec un entretien de routine, et ils le veulent dans un mois pour 20 000 $. Ce sont vos contraintes; respecter les minimums sans dépasser les maximums. Faire cela est "assez bien" et vous rapporte le salaire. Ce serait une mauvaise ingénierie pour vous de construire le Golden Gate Bridge, dépassant de loin les spécifications de conception et le budget de plusieurs ordres de grandeur. Vous finissez généralement par manger les dépassements de coûts et payer des pénalités pour les dépassements de temps. Ce serait également une mauvaise ingénierie pour vous de construire un pont de corde évalué pour le poids de 5 hommes adultes, même si cela ne coûte que 1000 $ en temps et en matériaux; vous n'obtenez pas de bons commentaires et témoignages de clients,
De retour dans le logiciel, disons que vous avez un client qui a besoin d'un système de traitement de fichiers conçu pour digérer les fichiers entrants et mettre les informations dans le système. Ils veulent que cela se fasse en une semaine et il doit gérer cinq fichiers par jour, environ 10 Mo de données, car c'est tout le trafic qu'ils reçoivent actuellement. Vos précieuses théories passent largement par la fenêtre; votre tâche consiste à créer un produit qui répond à ces spécifications en une semaine, car ce faisant, vous respectez également le budget des coûts du client (car les matériaux sont généralement une goutte dans le seau pour un contrat de logiciel de cette taille). Passer deux semaines, même pour dix fois le gain, n'est pas une option, mais le plus probable n'est pas non plus un programme construit en une journée qui ne peut gérer que la moitié du débit, avec l'instruction d'avoir deux copies en cours d'exécution.
Si vous pensez qu'il s'agit d'un cas marginal, vous vous trompez; c'est l'environnement quotidien de la plupart des internes. La raison en est le ROI; ce programme initial ne coûte pas cher et se paiera donc très rapidement. QUAND les utilisateurs finaux en ont besoin pour faire plus ou aller plus vite, le code peut être refactorisé et mis à l'échelle.
C'est la raison principale derrière l'état actuel de la programmation; l'hypothèse, confirmée par toute l'histoire de l'informatique, est qu'un programme n'est JAMAIS statique. Il devra toujours être mis à niveau et il sera éventuellement remplacé. En parallèle, l'amélioration constante des ordinateurs sur lesquels les programmes s'exécutent permet une diminution de l'attention à l'efficacité théorique et une attention accrue à l'évolutivité et à la parallélisation (un algorithme qui s'exécute en temps N carré mais qui peut être parallélisé pour fonctionner sur N cœurs sera semblent linéaires, et souvent le coût de plus de matériel est moins cher que celui des développeurs pour concevoir une solution plus efficace).
En plus de cela, il y a le principe très simple selon lequel chaque ligne de code développeur est quelque chose d'autre qui peut mal tourner. Moins un développeur écrit, moins il est probable que ce qu'il écrit a un problème. Ce n'est pas une critique du "taux de bogues" de quiconque; c'est une simple déclaration de fait. Vous savez peut-être comment écrire un MergeSort en arrière et en avant dans 5 langues, mais si vous ne touchez qu'un seul identifiant dans une ligne de code, le tri entier ne fonctionne pas, et si le compilateur ne l'a pas détecté, cela peut vous prendre heures pour le déboguer. Comparez cela avec List.Sort (); c'est là, c'est efficace dans le cas général, et, voici la meilleure chose, ça marche déjà.
Ainsi, un grand nombre des fonctionnalités des plates-formes modernes et des principes des méthodologies de conception modernes ont été construits dans cet esprit:
- POO - créez des données et une logique associées dans un objet, et partout où le concept de cet objet est valide, de sorte qu'il soit l'objet, ou une dérivation plus spécialisée.
- Modèles prédéfinis - 60% ou plus du code est une corruption syntaxique et les bases pour que le programme affiche quelque chose à l'écran. En standardisant et en générant automatiquement ce code, vous réduisez de moitié la charge de travail du développeur, ce qui permet une augmentation de la productivité.
- Bibliothèques d'algorithmes et de structures de données - Comme dans ce qui précède, vous savez peut-être comment écrire une pile, une file d'attente, un QuickSort, etc., mais pourquoi le devez-vous, alors qu'il existe une bibliothèque de code qui intègre tout cela? Vous ne réécririez pas IIS ou Apache parce que vous aviez besoin d'un site Web, alors pourquoi implémenter un algorithme QuickSort ou un objet arborescent rouge-noir lorsque plusieurs implémentations intéressantes sont disponibles?
- Interfaces fluides - Dans le même sens, vous pouvez avoir un algorithme qui filtre et trie les enregistrements. C'est rapide, mais ce n'est probablement pas très lisible; cela prendrait un jour à votre développeur junior juste pour le comprendre, et encore moins pour effectuer le changement chirurgical nécessaire pour trier sur un champ supplémentaire dans l'objet d'enregistrement. Au lieu de cela, des bibliothèques comme Linq remplacent beaucoup de code très laid, souvent fragile, par une ou deux lignes d'appels de méthode configurables pour transformer une liste d'objets en objets filtrés, triés et projetés.