


Vous voulez devenir ingénieur logiciel ? La difficulté de l'apprentissage descendant.
Depuis que je suis jeune, j'ai toujours été une personne extrêmement curieuse qui aimait comprendre et résoudre des problèmes. J'ai été initié à la programmation au lycée et j'en suis rapidement devenu obsédé pour des raisons évidentes.
Au lycée, les premiers langages et outils dont je me souviens avoir utilisé étaient des choses comme Turing, Processing, GreenFoot et BlueJ. Tous étaient des outils d’apprentissage et, à l’exception de Turing, étaient des abstractions Java axées principalement sur la programmation graphique. Ces outils m’ont permis de faire des choses plutôt sympas, très rapidement. Ces premières expériences sont vraiment ce qui a inspiré mon intérêt.
À partir de là, je souhaite aller dans mon collège local pour étudier le développement Web. Ici, j'ai commencé à apprendre des choses comme HTML, CSS, JavaScript. Passons ensuite à des choses comme PHP, Ruby, ASP.NET, Angular et de nombreuses autres compétences connexes en dehors du développement pur. C'était un cours merveilleux et m'a donné toutes les compétences dont j'avais besoin pour être un développeur Web très efficace.
À la fin de mon parcours universitaire, j'avais une assez bonne compréhension du développement Web dans son ensemble. Je ne savais certes pas tout mais j'en étais au point où rien n'était un mystère pour moi. À partir de là, ma curiosité naturelle m’a donné envie d’approfondir. Cela m'a conduit dans le terrier des systèmes d'exploitation, du développement au niveau des systèmes et des systèmes embarqués. Comme vous pouvez l'imaginer, la première étape consistait à apprendre C.
Apprendre le C a été bien plus difficile que ce à quoi je m'attendais. Le concept de pile et de mémoire tas ainsi que celui des pointeurs était extrêmement déroutant. Surtout venant de langages de niveau supérieur avec des garbage collectors. Il m'est vite apparu non pas que C était simplement plus difficile, en réalité le langage était en fait assez simple, mais que je devais constamment désapprendre toutes les mauvaises habitudes et hypothèses incorrectes que j'avais prises au cours des dernières années en apprenant des langages de niveau supérieur !
C'est ce que j'appelle désormais la malédiction de l'apprentissage descendant !
Je suis devenu extrêmement frustré d'avoir fait toutes ces fausses hypothèses lors de l'apprentissage de langages non systémiques. Cela a également rendu le processus d’apprentissage du C trois fois plus long qu’il n’aurait probablement dû.
Je manquais d'appréciation pour les abstractions que j'utilisais !
Ne vous méprenez pas, de nombreuses personnes peuvent mener une carrière entière en se concentrant uniquement sur le développement au niveau des applications ou sur les scripts Python de base. Cependant, si vous voulez vraiment être un ingénieur logiciel et comprendre le domaine dans son ensemble, des systèmes embarqués aux systèmes d'exploitation et aux applications développées pour ces systèmes d'exploitation, il est très avantageux d'adopter une approche ascendante.
Ma suggestion à tous ceux qui veulent vraiment devenir ingénieur logiciel est de commencer par C. Comprenez la différence entre la pile et le tas ainsi que les pointeurs. Essayez un peu d'assemblage, même s'il s'agit simplement d'analyser l'assemblage produit par vos petites applications C. Si vous comprenez ces choses fondamentalement, tout le reste deviendra beaucoup plus facile !
J'aurais aimé que ce soit comme ça que j'ai commencé. tirez-vous de mes erreurs !
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

La portée de JavaScript détermine la portée d'accessibilité des variables, qui sont divisées en étendue globale, fonction et au niveau du bloc; Le contexte détermine la direction de cela et dépend de la méthode d'appel de fonction. 1. Les étendues incluent la portée globale (accessible n'importe où), la portée de la fonction (valide uniquement dans la fonction) et la portée au niveau du bloc (LET et const sont valides dans {}). 2. Le contexte d'exécution contient l'objet variable, la chaîne de portée et les valeurs de cela. Cela pointe vers global ou non défini dans la fonction ordinaire, l'appel de méthode pointe vers l'objet d'appel, le constructeur pointe vers le nouvel objet, et peut également être explicitement spécifié par appel / application / liaison. 3. La fermeture fait référence aux fonctions accédant et en se souvenant des variables de portée externes. Ils sont souvent utilisés pour l'encapsulation et le cache, mais peuvent provoquer

La coulée de type est le comportement de la conversion automatique d'un type de valeur en un autre type en JavaScript. Les scénarios courants incluent: 1. Lorsque vous utilisez des opérateurs, si un côté est une chaîne, l'autre côté sera également converti en une chaîne, comme '5' 5. Le résultat est "55"; 2. Dans le contexte booléen, les valeurs non cooliennes seront implicitement converties en types booléens, tels que des chaînes vides, 0, nuls, non définies, etc., qui sont considérées comme fausses; 3. Null participe aux opérations numériques et sera convertie en 0, et non défini sera converti en NAN; 4. Les problèmes causés par la conversion implicite peuvent être évitées grâce à des fonctions de conversion explicites telles que Number (), String () et Boolean (). La maîtrise de ces règles aide

CompositionAPI dans Vue3 convient plus à la logique complexe et à la dérivation de type, et OptionsAPI convient aux scénarios et débutants simples; 1. OptionsAPI organise le code en fonction d'options telles que les données et les méthodes, et a une structure claire mais les composants complexes sont fragmentés; 2. CompositionAPI utilise la configuration pour concentrer la logique liée, ce qui est propice à la maintenance et à la réutilisation; 3. CompositionAPI réalise la réutilisation logique sans conflit et paramétrisable par le biais de fonctions composables, ce qui est mieux que le mixin; 4. CompositionAPI a une meilleure prise en charge de la dérivation de type dactylographiée et de type plus précise; 5. Il n'y a pas de différence significative dans le volume de performances et d'emballage des deux; 6.

Il existe une différence essentielle entre les travailleurs Web de JavaScript et Javathreads dans un traitement simultané. 1. JavaScript adopte un modèle unique. WebWorkers est un fil indépendant fourni par le navigateur. Il convient pour effectuer des tâches longues qui ne bloquent pas l'interface utilisateur, mais ne peuvent pas utiliser le DOM; 2. Java prend en charge le multithreading réel à partir du niveau de la langue, créé via la classe de threads, adapté à un traitement simultanée complexe et côté serveur; 3. Les travailleurs Web utilisent PostMessage () pour communiquer avec le fil principal, qui est hautement sécurisé et isolé; Les threads Java peuvent partager la mémoire, de sorte que les problèmes de synchronisation doivent être prêts à prêter attention; 4. Les travailleurs Web sont plus adaptés à l'informatique parallèle frontale, comme le traitement d'image, et

Utilisez Document.CreateElement () pour créer de nouveaux éléments; 2. Personnaliser les éléments via TextContent, ClassList, SetAttribute et d'autres méthodes; 3. Utilisez des méthodes APPEDCHILD () ou plus flexibles APPEND () pour ajouter des éléments au DOM; 4. Utiliser éventuellement INSERTBEFORE (), avant () et d'autres méthodes pour contrôler la position d'insertion; Le processus complet consiste à créer → Personnaliser → Ajouter, et vous pouvez mettre à jour dynamiquement le contenu de la page.

Initialiser le projet et créer package.json; 2. Créez un script d'entrée index.js avec shebang; 3. Registre des commandes via des champs bin dans package.json; 4. Utilisez des Yargs et d'autres bibliothèques pour analyser les paramètres de ligne de commande; 5. Utilisez le test local NPMLink; 6. Ajouter l'aide, la version et les options pour améliorer l'expérience; 7. Publier éventuellement via NPMPublish; 8. Affectuer éventuellement l'achèvement automatique avec Yargs; Enfin, créez des outils CLI pratiques grâce à une structure raisonnable et à une conception de l'expérience utilisateur, effectuer des tâches d'automatisation ou distribuer des widgets et se terminer par des phrases complètes.

Les types de conditions avancées de TypeScript implémentent le jugement logique entre les types via TextendU? X: Y Syntaxe. Ses capacités de base se reflètent dans les types de conditions distribuées, l'inférence de type inférieure et la construction d'outils de type complexe. 1. Le type conditionnel est distribué dans les paramètres de type nu et peut automatiquement diviser le type de joint, tel que pour obtenir la chaîne [] | nombre []. 2. Utiliser la distribution pour construire des outils de filtrage et d'extraction: exclut exclut les types via TextendU? Never: T, extraire extrait les points communs via TextendU? T: jamais, et des filtres non nuls nuls / non définis. 3

MicrofronttendSSolvescalingCallegengeSInLargeTeamsByAnabled indépendante développement et élaboration de choOsanIntegrationsStrategy: UseModuleFederationInwebpack5ForruntimeLoadingAndTrue Independence, Build-Time IntegrationForsIpleSetups, Oriframes / webcomponents webcomponents
