J'ai commencé la programmation quand j'étais au lycée. On nous apprenait, entre autres, Pascal et HTML. Entre temps, pendant les vacances d'été, je prenais des cours de programmation dans un institut TIC. C'est là-bas que j'ai appris Visual Basic et la conception de logiciels et de bases de données (A ce temps là, on utilisait MERISE (Méthode d'Etude et de Réalisation Informatique pour les Systèmes d'Entreprise)). Un jour, j'ai pu obtenir le CD d'installation de Visual Basic, donc je l'ai installé sur mon PC et j'ai commencé à pratiquer tout seul, avec des bouquins.
Mais, ce n'est qu'après le bac que j'ai commencé à apprendre et à appliquer C# presque à plein temps pendant les études supérieures, et c'est ça que je considère comme mon véritable début en programmation et ingénierie logicielle.
J'ai appris quelques leçons au cours de la dernière décennie, et je me suis dit que je prendrais un moment pour recueillir mes réflexions sur ces sujets. Il m'a fallu environ dix ans et beaucoup d'expérimentation pour assimiler certaines de ces choses.

 

1. Apprendre un langage de programmation, c'est la partie la plus facile: attention aux plateformes
Prenons C# par exemple. Apprendre le langage C# n'est pas difficile. Si tu as déjà une bonne compréhension des fondamentaux de langues informatiques, et si tu as un peu d'expérience dans d'autres langues orientées objet, tu peux devenir un programmeur C# compétent en quelques jours, du moins en ce qui concerne le langage en lui-même. Cependant, le vrai prix à payer de l'apprentissage n'est pas dans le langage, c'est dans la plateforme. Pour développer avec C# sur .NET, tu dois connaître:
   - le Framework .NET
   - une ou plusieurs technologies .NET telles que ASP.NET ou WPF
   - et l'environnement de développement Visual Studio.
Le temps requis pour devenir compétent dans le développement sous .NET se mesure généralement en mois, même pour un développeur expérimenté. Apprendre une plateforme est toujours plus coûteux que d'apprendre un langage spécifique, donc choisir la plateforme est la décision la plus cruciale.
L'apprentissage a toujours un coût et ce coût est l'un des facteurs clés à prendre en considération lors du choix de la technologie que tu souhaites apprendre. Le coût réel de l'apprentissage est dans le temps, l'apprentissage prend toujours du temps. Puisque tu n'as pas le temps de tout apprendre, il est important de penser stratégiquement à ce que tu veux apprendre. Et puisque les langages sont faciles, c'est surtout aux plateformes qu'il faut faire attention : les technologies associées au langage, les outils de développement et de déploiement, les systèmes d'exploitation, et autres infrastructures.

 

2. Je répète, apprendre un langage de programmation est la partie la plus facile: à la rencontre des concepts fondamentaux de l'ingénierie logicielle
La syntaxe en elle-même, les mots que tu utilises lorsque tu utilises le langage sont relativement simples et tu peux les apprendre facilement. Cependant, c'est loin d'être suffisant pour produire du code de qualité, qui implique souvent des principes OOP, TDD, BDD et SOLID, des tests unitaires, des patrons de conception et d'autres concepts techniques qui dépassent le cadre de cet article. Enfin, bref.

 

3. En fait, écrire du code n'est qu'une (petite) partie du travail
Un ingénieur logiciel est souvent impliqué dans la recherche technologique, la configuration d'outils et de projets, les tâches d'administration et de déploiement, les procédures de débogage et d'essai, la documentation et la dette technique (correction et refactorisation du code existant). De plus, il doit réfléchir à des solutions et concevoir des systèmes: parfois, le travail le plus important se fait pendant qu'on est loin du clavier.

 

4. Recettes éprouvées et efficaces : les vieilles techniques ennuyeuses sont parfois les meilleures
Ce n'est pas vraiment "vieux contre nouveau", ni même "cool vs ennuyeux", mais plutôt la technique avec laquelle tu as le plus d'expérience. Comme disait l'autre, je ne compte pas sur le codeur qui a pratiqué 1000 technologies une seule fois mais sur celui qui a pratiqué la technologie adéquate 1000 fois. Si l'objectif est de construire un truc de manière aussi effective et rapide que possible, ce serait plus productif d'utiliser les technologies que tu maitrises le mieux.
Par exemple, un de mes contacts se fait 25 000 $ par mois avec un SaaS qu'il a construit avec une combinaison ennuyeuse : ASP.NET + SQL Server + Angular 1, parce que c'est ce qu'il connaissait. Il l'héberge sur Windows, parce qu'il sait comment rendre Windows rapide et sécurisé. Il a réussi parce qu'il consacre tout son temps à construire des fonctionnalités que ses clients réclament, plutôt que d'apprendre les technologies les plus en vogue.
Il est important de se rendre compte que le tapis roulant de la technologie ne s'arrête jamais, il y a toujours de nouvelles choses à apprendre. En fait, un nouveau Framework JavaScript est probablement en train d'être lancé pendant que tu es en train de lire cet article. Les technologies de pointe les plus populaires aujourd'hui n'existaient même pas lorsque je débutais (EF Code First, Xamarin, ASP.NET Core, Razor), ce qui nous conduit aux 2 points qui suivent.

 

5. Concentre-toi sur les technologies durables
La seule constante dans le monde, c'est le changement. La gestion du temps et des actions est une compétence importante chez les développeurs, en particulier, parce que nous sommes sur un tapis roulant technologique qui ne cesse de bouger, voire d'accélérer.
Par exemple, les technologies Web qui étaient populaires vers l'an 2000 (Flash, ASP Classic et Java Applets) deviennent quasiment obsolètes et de moins en moins professionalisantes. Aujourd'hui, on parle de ASP.NET Core, SignalR, Angular2, React et VueJS. Aucune de ces technologies n'existaient en l'an 2000, et ces nouvelles technologies seront probablement obsolètes d'ici 10 ans.
Qu'est ce qui n'a pas vraiment changé ? Les fondamentaux de langages tels que C++/C#, leurs implémentations d'algorithmes et leurs principes sont toujours aussi pertinents sur plusieurs dizaines d'années. Si tu maitrises les bases d'un système stable, tu pourrais mieux t'adapter au changement, tu pourrais l'apprécier et t'en servir pour évoluer.

 

6. Équilibre entre exploration et exploitation
L'exploration consiste à apprendre de nouvelles choses, à étudier de nouvelles techniques, à lire des livres, à regarder des tutoriels, à pratiquer et à améliorer ses compétences. L'exploitation, au contraire, consiste à tirer parti de ce que nous savons déjà pour régler de vrais problèmes. Il s'agit de penser créativement à des façons d'utiliser les connaissances que nous avons déjà pour créer de la valeur pour les autres.
Donc, oui, ces deux tâches sont à la fois nécessaires et importantes. Le risque, c'est d'être trop fixé sur l'une ou l'autre de ces activités.
Trop d'exploration, et tu ne pourras jamais atteindre un niveau d'expertise utile dans une technologie donnée. Il y a un coût d'opportunité énorme avec cette sorte d'apprentissage léger, puisque, bien que ça t'élargisse l'esprit, le temps que ca nécessite implique que tu perfectionnes moins les compétences que tu as déjà acquises.
En revanche, une trop grande exploitation peut t'empêcher d'évoluer dans les nouvelles technologies, et peut limiter tes opportunités d'emploi.

 

7. C'est facile d'être excellent... C'est difficile d'être constant.
C'est facile d'être excellent pendant 2 minutes. C'est difficile de l'être constamment, chaque jour.
Quand tu es habité par une bonne idée pour un nouveau projet, tu ressens une grande envie de commencer la recherche, le design et la programmation. Tu as hâte de transformer ton idée en quelque chose de réel et tu deviens super productif. Mais le problème est que cette motivation se fane avec le temps.
Oui, c'est marrant et c'est facile d'avoir de nouvelles idées et de commencer à y travailler. Mais ensuite, il y a les efforts à fournir, les ajustements, le lancement, la maintenance, les corrections, les améliorations, etc. Sur plusieurs mois. C'est là que ça devient dur. C'est dur de rester concentré sur une même idée, sur un même projet pendant des mois et des années. Ça demande beaucoup de discipline.
C'est facile d'être excellent. C'est difficile d'être constant.

 

8. Diversifie tes compétences
Ne sois pas seulement un programmeur, devient un Expert Qui Programme, un expert dans un autre domaine pertinent dont tu es passionné. Tu peux être un entrepreneur, un chef de projet, un scientifique en Big Data, un chercheur, un spécialiste de la sécurité, etc.
Si tu es un Expert Qui Programme, en plus de pouvoir programmer (peut-être à temps plein), tu as également une crédibilité supplémentaire qui est liée à d'autres domaines, au-delà de l'ingénierie logicielle.
D'où l'importance de poursuivre des études supérieures. Si tu vas à l'Université ou en Grande École alors que tu sais déjà programmer, tu n'apprendras probablement pas grand-chose à propos de la programmation. Mais ça ne veut pas dire que tu ne devrais pas aller dans ces écoles. Tu auras besoin d'une certaine culture, et les universités sont d'excellents endroits pour l'obtenir. Tu acquiers la culture en étudiant et en comprenant le monde que les humains ont créé, sous différents angles. Ce serait difficile d'acquérir ce genre de connaissances si tu ne fais rien d'autre qu'étudier la programmation.

 

9. Choisis des niches pour te démarquer
Plus la niche est petite, plus tu es perçu comme un agent exceptionnel dans ton domaine. Par exemple, il est très difficile pour des développeurs de se démarquer avec un titre tel que "Développeur Web PHP". Ils sont compétents, polyvalents, utiles, mais pas remarquables. Ils se sentent facilement remplaçables parce qu'il y en a tellement, avec un ensemble de compétences comparables. Le domaine est trop large pour que tu puisses te démarquer facilement du lot. Si, par contre, tu deviens reconnu dans une niche, comme Xamarins.Forms ou Visualisations JavaScript, tu serais beaucoup plus apte à te distinguer par ceux qui recherchent spécifiquement ces compétences.

 

10. L'âge des Compétences
L'information est la connaissance spécifique dont tu as besoin pour résoudre des problèmes. Les compétences représentent la capacité de mettre en œuvre des solutions en utilisant tes connaissances.
Dans un monde où la plupart des connaissances et des outils sont quasiment gratuits, qu'est-ce qui fait la différence ? C'est la compétence, bien évidemment. Nous ne sommes plus une société fondée sur le savoir, nous sommes une société axée sur les compétences. Il fut un temps où presque tous les diplômes universitaires garantissaient un bon travail. Maintenant, ce n'est plus le cas. On s'en fiche de ce que tu sais. On s'intéresse à ce que tu sais FAIRE. On te paye pour faire des choses, pas pour connaître les choses.

 

Apprendre à programmer en 10 ans
Selon plusieurs recherches, il faut environ 10 ans (ou 10 000 heures) pour développer une expertise.
La solution, c'est la pratique réfléchie : il ne suffit pas de refaire les mêmes choses encore et encore, mais plutôt de se défier avec une tâche qui dépasse sa capacité actuelle, l'essayer, analyser ses performances pendant et après, et corriger toute erreur. Ensuite, répéter. Et recommencer. Il semble qu'il n'y ait pas vraiment de raccourcis. L'apprentissage par la lecture, c'est bien. Mettre la main à la pâte, c'est mieux. Le meilleur type d'apprentissage est l'apprentissage par la pratique.
Personnellement, les petits projets perso et les prototypes m'ont effectivement aidé à m'améliorer. Mais il y a encore beaucoup de choses intéressantes à maitriser donc continuons d'apprendre.