Classification des développeurs d'arts martiaux

Comme les développeurs sont appelés


Dans mon blog, j'utilise les termes «programmeur», «codeur», «développeur» et «ingénieur» de manière interchangeable pour éviter la tautologie. Néanmoins, je pense qu'il existe des différences entre ces mots et d'autres similaires.

Dans cet article, nous allons discuter d'un ensemble de noms typiques pour désigner une personne qui écrit du code. Je vais donner mon interprétation de la façon dont ces termes se rapportent au niveau de maîtrise.

Interprétation des valeurs


Les définitions présentées ici ne sont pas officielles. Je ne connais aucune définition formelle ni norme acceptée. Cependant, beaucoup de gens ont une forte opinion sur cette question. Ma compréhension de chaque terme est basée sur 30 ans d'expérience dans l'industrie du logiciel, mais je suis absolument prêt à ce que d'autres soient en désaccord avec mon interprétation.

Je ne veux pas argumenter ou convaincre des gens avec une opinion différente. En général, il n'est guère possible de parler d'une opinion bonne ou fausse. Néanmoins, si vous n'avez pas encore pris position sur cette question, j'espère que ce guide apportera une certaine clarté.

Approche tripartite


Pour plus de clarté, chaque terme recevra trois caractéristiques:

1. Niveau de maîtrise


Une description du niveau de compétence pour ce terme, dans mon interprétation.

2. Parallèlement aux rangs des arts martiaux


Une analogie avec les rangs des arts martiaux. En particulier, nous comparons le niveau technique des compétences avec les couleurs des ceintures des artistes martiaux.

3. Exemple de code


Un exemple de la façon dont une personne de ce niveau devrait aborder une tâche de programmation simple. La définition ici est triviale et n'a pas été conçue comme un exemple réaliste. L'objectif est de comparer et de discuter des niveaux de compétence. Par simplicité, l'exemple est choisi de manière à convenir à un spécialiste de tout niveau. Voici le problème que nous allons considérer:

Calculer la somme des entiers

Veuillez jouer avec moi et présenter cette tâche comme intermédiaire pour beaucoup plus difficile. Dans notre univers fictif, une tâche nécessite une réflexion sérieuse et a de nombreuses solutions et approches potentielles. Imaginez que c'est le module central du système que vous souhaitez faire évoluer.

J'utiliserai Ruby pour des exemples d'implémentation triviaux. Le code est assez simple: il est compréhensible même si vous ne connaissez pas Ruby.

3. Liste


Noms discutés:

  • Débutant
  • Codeur
  • (Hacker)
  • Programmeur
  • Chercheur (informaticien)
  • Développeur logiciel
  • Ingénieur logiciel
  • Architecte logiciel

Commençons donc.

Ceintures d'arts martiaux




Quand j'ai vécu en Italie dans ma jeunesse - il y a environ 20 kilogrammes - j'ai pratiqué le judo et le kung-fu pendant plusieurs années. Ensuite, j'ai appris que dans de nombreux arts martiaux, le niveau de compétence correspond à la couleur de la ceinture. Habituellement, la couleur passe du blanc au noir, où le niveau d'expérience correspond à l'obscurité de la ceinture.

Un débutant porte une ceinture blanche car il n'a aucune expérience. La couleur blanche signifie «neuf et propre». Pendant que vous vous entraînez, la ceinture s'assombrit, montrant des progrès. La couleur représente la saleté accumulée par le travail acharné et la transpiration. Un artiste martial avec de nombreuses années d'expérience atteint finalement la ceinture noire, ce qui signifie un niveau élevé de connaissances et de compétences.

Traditionnellement, les ceintures n'étaient que noires ou blanches. Au cours des dernières décennies, plus de fleurs sont apparues. Aujourd'hui, différentes écoles d'arts martiaux utilisent des couleurs différentes. Le schéma dépend du style, de l'école et du pays.

Pourquoi parlons-nous des arts martiaux?


Les couleurs de ceinture sont utilisées pour établir un parallèle entre les compétences logicielles et les compétences en arts martiaux. Pour ce faire, prenez le schéma de couleurs couramment utilisé en Europe: blanc, jaune, orange, vert, bleu, marron et noir.

Le tableau suivant montre les niveaux de développeur dont j'ai parlé. Pour chacun, la couleur de la ceinture et la position, qui est généralement attribuée à un spécialiste de ce niveau, sont indiquées:

Niveau professionnelNiveau d'arts martiaux (couleur de ceinture)Exemple de publication
DébutantBlanc
HackerStreet Fighter (pas de ceinture)
CodeurJauneDéveloppeur junior (Jr.Dev)
ProgrammeurOrangeDéveloppeur logiciel
Chercheur (informaticien)VertDéveloppeur logiciel
Développeur logicielBleuDéveloppeur logiciel senior (développeur logiciel principal)
Ingénieur logicielMarronDéveloppeur principal (développeur principal)
Architecte logicielNoirArchitecte logiciel

Le niveau de compétences en ingénierie est lié aux compétences techniques et de travail d'équipe. Le titre du poste est un exemple de la façon dont une personne de ce niveau est appelée dans l'industrie (cela dépend grandement de l'entreprise et de la région).

Novice: ceinture blanche




Vous devez commencer quelque part, et c'est généralement le niveau «pas d'expérience du tout». Un débutant en développement logiciel est quelqu'un qui vient de se familiariser avec la programmation et qui en est aux premiers stades de la formation. Les débutants ne peuvent toujours pas programmer en toute confiance et ne comprennent pas les programmes simples, sans consulter les livres, les manuels ou demander conseil à un ami expérimenté.

Les débutants sont capables d'écrire du code de travail, mais ne comprennent souvent pas les détails de la raison pour laquelle ce code fonctionne. Ils passent beaucoup de temps à rechercher des fragments de code sur StackOverflow ou des sites similaires et à combiner ces fragments jusqu'à ce que quelque chose fonctionne.

Les outils puissants ne sont pas seulement des compétences fiables.


Pour rendre les choses encore plus confuses, de nombreux langages et cadres «modernes» permettent à quiconque de générer une structure et certaines implémentations de programmes complexes sans comprendre ce qui se passe en arrière-plan. Par exemple, le lancement d'une simple application Ruby on Rails et l'acceptation de requêtes HTTP peuvent être organisés à l'aide de plusieurs commandes à partir de la ligne de commande.

Voici comment le faire sous * nix:

$ gem install rails

$ rails new website

$ cd website
$ bin/rails server
...


C'est fait! Cela suffit pour que le serveur réponde aux requêtes HTTP du navigateur. Si vous comparez avec les arts martiaux, voici comment apparaître sur le tatami en armure et avec des armes. L'armure vous permettra de vivre un peu plus longtemps, et avec une arme, vous pouvez gagner la bataille. Mais une telle victoire ne fait pas de vous un artiste martial qualifié. Ces outils vous permettent simplement de faire quelque chose de complexe sans formation ni effort traditionnels.

Ne vous méprenez pas. Des outils comme Ruby on Rails vous permettent de faire avancer les choses rapidement, et ils sont excellents. En fait, je trouve fantastique de réduire le temps nécessaire pour écrire le code standard initial. C'est un bon début pour le projet, mais juste une ceinture blanche suffit.

La vraie bataille commence là où le didacticiel se termine, où les outils ne peuvent pas générer automatiquement l'application dont vous avez besoin. Pour continuer, vous devez devenir codeur.

Exemple


Si un débutant veut écrire un programme qui résume un ensemble de nombres en utilisant Ruby, il peut alors rechercher la question sur Google et trouver une telle page . Il s'agit du premier résultat de Google au moment d'écrire ces lignes. Sur la page StackOverflow, la réponse la plus prolifique avec 524 votes:

 array.inject(0){|sum,x| sum + x } 

Bien sûr, cela fonctionne. Voici un exemple:

 $ irb 2.4.2 :001 > array=[1,2,3] => [1, 2, 3] 2.4.2 :002 > array.inject (0){|sum, x| sum + x } => 6 

Cela peut fonctionner pour un débutant, mais il ne comprend pas les fonctionnalités de ce code. Est-il lisible? Quelle est sa vitesse par rapport aux autres options? Est-il facile à entretenir? Pourquoi ça marche? Que se passe-t-il exactement lorsque cette ligne est exécutée? Combien de temps CPU est utilisé? Les variables sum et x sont-elles définies après l'exécution de cette ligne?

Le développeur novice Ruby ne connaît pas les réponses à la plupart de ces questions.

Encodeur: ceinture jaune




Un encodeur peut, sans aide extérieure, collecter de nombreuses lignes de code informatique pour résoudre des problèmes simples. Le résultat ne sera pas très beau, mais l'encodeur comprend pourquoi le programme fonctionne et réussit la tâche.

Première étape nécessaire


J'ai appelé mon blog CoderHood, parce que tous ceux qui gagnent leur vie en programmant à un moment donné ont atteint le niveau du codeur. Le mot Coderhood reflète la vie d'un développeur dans le monde de la technologie, à commencer par la première ceinture jaune.

La principale différence entre un débutant et un encodeur est que l'encodeur est capable d'écrire du code et de le comprendre. Ils peuvent ne pas comprendre en détail ce qui se passe dans les coulisses, mais il sait pourquoi il a écrit un tel code.

Dans l'industrie, un codeur se voit généralement attribuer un poste tel que "développeur junior" (développeur junior) ou stagiaire (développeur en formation).

Exemple


Je pense que le «codeur Ruby» pourra proposer la plupart des méthodes suivantes pour calculer la somme d'un tableau d'entiers et comprendre la différence entre eux:

 $ irb 2.4.2 :001 > array=[1,2,3] => [1,2,3] 2.4.2 :002 > array.inject (0){|sum, x| sum + x } => 6 2.4.2 :003 > sum=0;array.each { |x| sum+= x } => 6 2.4.2 :004 > array. sum => 6 2.4.2 :005 > array.inject(0, :+) => 6 2.4.2 :006 > array.reduce(0, :+) => 6 2.4.2 :007 > eval array.join '+' => 6 

Si vous êtes intéressé, certaines de ces méthodes sont terribles, mais elles fonctionnent.

Hacker: un jean sans ceinture




J'ai mis un "hacker" sur la liste parce qu'on m'a posé des questions à ce sujet. Mais il n'est pas bien adapté à notre discussion.

Pas la compétence principale


Je ne pense pas que le «piratage» soit une compétence nécessaire dans le développement d'un développeur de logiciels. Une telle expérience est utile pour apprendre à tester et protéger des applications et des systèmes logiciels, mais je ne vois pas ici une description du «niveau de compétence» général. Je classerais cela comme un certain domaine d'activité et non comme un niveau de compétence technique. En fait, le niveau de compétence d'un pirate peut être quelconque. Certains d'entre eux sont incroyables, tandis que d'autres ne le sont pas .

Étant donné que le piratage n'est pas une étape nécessaire dans le développement d'un développeur, par mon analogie, un pirate n'a pas de ceinture traditionnelle. Ils ressemblent plus à des combattants de rue portant des jeans.

Certains d'entre eux sont de mauvais voyous, d'autres tentent de survivre, d'autres sont de bons gars qui protègent le reste, mais la plupart se situent quelque part entre les deux.

De nombreux types de "hackers"


Il existe de nombreux types de pirates. Certains peuvent programmer, d'autres non. La signification du mot dépend du contexte et de qui l'utilise. Quelques définitions courantes:

  1. Un expert en informatique qui adhère à une sous-culture de la technologie et de la programmation.
  2. Une personne qui peut compromettre la sécurité informatique à des fins malveillantes (chapeau noir) ou de recherche (chapeau blanc).
  3. Un développeur qui fait le travail de la manière la plus rapide et la plus sale.
  4. Une personne qui étudie, expérimente ou étudie les systèmes, équipements et systèmes de télécommunications connectés aux réseaux téléphoniques. Ces pirates sont également appelés phreakers.
  5. Un ingénieur qualifié travaillant très près du matériel afin d'obtenir un meilleur contrôle du système dans le but de faire un bon travail (c'est-à-dire pour extraire plus de performances de l'équipement) ou à des fins malveillantes (c'est-à-dire pour utiliser des trous de sécurité et trouver un moyen de contourner la protection de la salle d'opération systèmes).

Quelques exemples


Type 3


Un pirate de type 3 peut choisir cette option de sommation d'un tableau d'entiers:

$ irb
2.4.2: 001> 'echo "1 2 3" / bc'.to_i
=> 6

La méthode fonctionne, au moins sur certains systèmes, mais c'est ... un "hack complet". Il en va de même pour les pirates informatiques non qualifiés qui peuvent programmer. Ils résolvent les problèmes de manière douteuse, généralement en exécutant des commandes de ligne de commande illisibles jusqu'à ce qu'ils obtiennent en quelque sorte le résultat souhaité.

Type 5


Les pirates de type 5 fonctionnent à un niveau très bas. Ces compétences ne sont pas faciles à acquérir et peuvent être très utiles si vous essayez de configurer la protection logicielle ou de créer des applications extrêmement hautes performances. Je n'ai jamais été "hacker", mais j'ai programmé à bas niveau (C et assembleur) et toujours dans l'âme je me considère comme un spécialiste de la programmation bas niveau.

Les pirates de type 5 peuvent être de fantastiques combattants de rue, avec des compétences folles qui essuieront le nez de nombreux programmeurs professionnels sur certaines tâches spécialisées. Ces "pirates" pourraient additionner un tableau d'entiers en utilisant un assembleur comme celui-ci .

Programmeur: ceinture orange




Un programmeur peut écrire des applications fonctionnelles, comprend les algorithmes de base et connaît les bases de l'informatique. Il peut faire fonctionner le programme, même s'il n'est pas très évolutif et pris en charge à long terme. En règle générale, un programmeur fonctionne bien seul. Pas le fait qu'il sera un bon joueur d'équipe.

La plupart des développeurs s'arrêtent à ce niveau, surtout s'ils ne prévoient pas d'étudier la théorie de l'informatique. Les programmeurs peuvent écrire du code décent et travailler dans l'industrie du logiciel à ce niveau tout au long de leur carrière.

Du point de vue de l'emploi, les programmeurs sont souvent appelés «développeurs de logiciels» ou «ingénieurs de logiciels».

Dans un exemple simple de la somme d'un tableau d'entiers, un programmeur peut écrire du code de cette façon:

 #!/usr/bin/env ruby if ARGV.size==0 puts "Usage: " puts " sum [  ,  ]" else puts ARGV.sum{|x| x.to_i} end 

Ce code implémente une commande de ligne de commande utile pour résumer une liste de nombres. Si vous l'appelez sans paramètres, il affiche un message d'utilisation utile. Sinon, imprime la sortie standard. Voici un exemple d'utilisation:

$./sum
Usage:
sum [ , ]
$ sum 1 2 3
6


Il s'agit d'une "solution complète", auto-documentée et quelque peu abstraite, car le programme peut être appelé à partir de la ligne de commande.

Chercheur: ceinture verte




Le chercheur (informaticien) a étudié l'informatique à l'école ou au travail. Il a une bonne compréhension de ces concepts:

  • Base Base-N (N = 2, 10, 16)
  • Opérations binaires
  • Logique booléenne
  • Complexité algorithmique et notation big-O
  • Structures de données (tableaux, listes liées, arbres B, arbres rouge-noir, files d'attente, piles, tables de hachage, tas, ensembles, graphiques)
  • Algorithmes de tri et quand les utiliser
    • Compréhension de base de l'exhaustivité des NP
  • Algorithmes de base multithread
  • Gestion de la mémoire et récupération de place (le simple fait que votre langage de programmation s'occupe de la gestion de la mémoire ne signifie pas que vous pouvez ignorer cette rubrique)
  • Pointeurs (vous devez au moins comprendre le concept, même si vous ne codez pas en C) et la différence entre le passage de paramètres par valeur ou référence.
  • Concepts de POO (interfaces, héritage, constructeurs, destructeurs, classes, objets, abstractions, encapsulation, polymorphisme, etc ...)
  • Conception et modèles orientés objet
  • Récursivité
  • Quelques concepts de base sur la programmation dynamique, l'analyse gourmande et d'amortissement, la comparaison de chaînes et les algorithmes d'approximation

Le chercheur est diplômé en informatique ou pendant de nombreuses années il a travaillé comme développeur, étudiant l'informatique appliquée au travail. Comme vous le savez, je ne pense pas qu'un diplôme CS soit nécessaire pour une carrière de développement réussie .

Le simple statut de «informaticien» ne fait pas de vous un excellent programmeur. Ici, l'analogie avec les couleurs des ceintures semble être violée. Mais ce n'est pas le cas. Pensez de ce côté: même dans le monde des arts martiaux, il existe des spécialisations. Certaines ceintures vertes font certaines choses mieux que d'autres. La progression est non linéaire. La couleur de la ceinture représente souvent le niveau d'expérience et la quantité de travail dépensé pour maîtriser l'art martial, plutôt que le niveau de compétence requis dans tous les aspects.

Le scientifique écrira probablement le même code pour la somme des nombres que le programmeur. La différence est que le scientifique peut immédiatement dire que la complexité de cet algorithme est le temps O (n). Comme déjà mentionné, c'est un exemple élémentaire, mais vous avez pris la pensée.

Développeur logiciel: Blue Belt




Un développeur de logiciels peut gérer des projets plus grands et plus complexes. Comparé à un programmeur et chercheur, il:

  • Écrit un code plus propre, plus structuré, maintenu, documenté et lisible.
  • Permet moins d'erreurs.
  • Ça marche plus vite.
  • Il travaille mieux en équipe et comprend la valeur des processus de développement.
  • Mieux localiser et optimiser les goulots d'étranglement dans les systèmes de code et de logiciels.
  • A plus d'expérience.

Exemple


Dans un exemple simple d'une somme d'entiers, un développeur de logiciels peut résoudre le problème en créant un service qui fournit une API Web. L'interface prend un ensemble d'entiers et renvoie la somme.

Je crois que l'application sera bien documentée et prendra en charge les paramètres, sera accompagnée de tests, aura la structure de code correcte et sera facilement maintenue par d'autres développeurs.

Sur Ruby, l'application principale utilisant Sinatra pourrait ressembler à ceci:

 require 'sinatra' require "sinatra/config_file" # Load the server configuration from config.yml: config_file 'config.yml' # # EndPoints: # # /sum/n1 n2 n3 n4 ... # Return: # {result: [sum of n1,n2,n3,n4,...]} # # Example: # $ curl http://localhost:8080/sum/1 2 3 4 # {"result":"10"} # get '/sum/:numbers' do |numbers| {result: numbers.split(" ").collect{ |x| x.to_i}.sum}.to_json end 

Un bon développeur de logiciels est bien conscient des nombreuses limites de cette solution par rapport aux autres. Par exemple, il est limité à la somme d'un ensemble de nombres qui tient dans un URI; il n'y a pas de vérification d'erreur explicite; les lignes doivent commencer par un nombre, etc.

Ingénieur logiciel: Brown Belt




La différence entre un développeur de logiciels et un ingénieur logiciel est subtile; Je l'admets pleinement. Ces termes sont couramment utilisés comme synonymes. Néanmoins, je suppose que l'ingénieur logiciel est un spécialiste possédant des connaissances dans le domaine de l'informatique et une vaste expérience en tant que développeur de logiciels. Les principales différences:

  • Possibilité de créer des systèmes plus évolutifs.
  • Longévité. Ils travaillent plus longtemps et avec moins de problèmes.
  • Moins de bugs et une meilleure qualité de code.
  • Capacité à agir en tant que chef de projet technique et équipe.
  • Excellentes compétences de collaboration et de communication.
  • Connaissance suffisante de l'architecture logicielle pour faire le travail.

Dans les entreprises, ces développeurs peuvent occuper les postes de «développeur senior» ou de «développeur senior».

Exemple


Un ingénieur logiciel peut écrire une application en tant que développeur en créant un service et en fournissant une API pour prendre un ensemble d'entiers. Mais je crois que la décision de l'ingénieur comprendra quelques améliorations:

  • Mise en cache des résultats.
  • Abstraction du concept de la somme à toute expression mathématique dans la requête.
  • Journalisation, authentification, suivi des hooks, etc.

L'exemple devient stupide


Comme vous pouvez le voir, un exemple trop simple à ce stade devient un peu idiot. Cela se résume à une discussion sur la façon d'améliorer une solution déjà redondante à un problème trivial.

Par exemple, la gestion d'un cache avec les résultats d'opérations simples sur un petit ensemble de nombres est probablement plus difficile et plus lente que les calculs simples. Un cache aurait du sens dans le cas d'un grand nombre de nombres à transmettre à l'API, mais la liste ne rentrerait pas dans l'URI de la demande.

Vous pouvez déplacer la liste des nombres vers le corps de la demande, mais ce ne sera plus l'API RESTFUL et la demande ne sera plus mise en cache. À ce stade, il sera tentant de modifier la demande en POST, mais elle ne sera jamais mise en cache. Dans tous les cas, la discussion peut continuer indéfiniment.

Partie critique


Vous voyez ce qui se passe? À mesure que les compétences des développeurs s'améliorent et que les projets deviennent plus complexes, une chose amusante se produit. Les problèmes s'éloignent de plus en plus du «code de base». Au lieu de cela, ils vont de plus en plus traiter le contexte dans lequel le code principal fonctionne.

En conséquence, les développeurs hautement qualifiés passent la plupart du temps à améliorer les aspects du système tels que l'évolutivité, les performances, la vérification des erreurs, la fiabilité, la maintenabilité, l'abstraction, la portabilité, le traitement des conditions aux limites, etc.

De plus, ils apprendront comment travailler plus efficacement ou améliorer l'interaction avec d'autres développeurs et comment se rendre au travail pour minimiser les risques, etc. Le développement logiciel passe du codage aux systèmes d'ingénierie et à la résolution de problèmes.

Architecte logiciel: Black Belt




Tous les développeurs et ingénieurs devraient être capables de concevoir les parties des systèmes et des produits qu'ils ont l'intention de construire. «Architecte logiciel» élève cette compétence à un niveau supérieur et fait un choix lors de la conception d'interactions de haut niveau de systèmes logiciels plus grands développés par d'autres ingénieurs.

Exemple


Dans notre exemple, entre autres, un architecte peut dessiner un tel diagramme pour diriger le développement d'un service de sommation d'entiers:



Pour résoudre efficacement de tels problèmes, un architecte logiciel a besoin d'années d'expérience à tous les niveaux. Cette expérience pratique entre dans la mémoire musculaire. Il permet à l'architecte de prendre les bonnes décisions de haut niveau sans se concentrer sur les détails.

Cependant, je ne crois pas aux architectes purs, c'est-à-dire aux ingénieurs qui prennent des décisions à plein temps à un haut niveau. Je pense qu'un architecte fiable devrait descendre au niveau des détails individuels et sortir de là quand c'est nécessaire. Il est prêt à plonger régulièrement et efficacement dans le code.

Dans les arts martiaux, la ceinture noire est professeur et mentor. Je pense que la formation et le mentorat sont aussi les tâches d'un architecte logiciel. L'enseignement dont je parle n'est pas direct (conférences), mais se fait plus par l'exemple, montrant la voie et guidant les gens à prendre leurs décisions.

Conclusions


Les combattants sérieux étudient l'art martial toute leur vie; les développeurs de logiciels sérieux font de même. J'espère que vous avez trouvé cette discussion utile. J'espère que cela fournit un contexte pour certains termes mal définis et aide idéalement à expliquer comment les utiliser plus précisément.

Source: https://habr.com/ru/post/fr418467/


All Articles