The NeceMoon | December 2016

10 Years of Programming

by necemon 24. December 2016 10:00


I started programming when I was in high school. I was taught Pascal and HTML among other things. But I was also taking some summer programming classes in an IT institute. That's where I learned Visual Basic and software/database design (during those days, we were using MERISE (Méthode d'Etude et de Réalisation Informatique pour les Systèmes d'Entreprise)). I eventually got Visual Basic installed on my home computer and a book from which I could practice alone, with books.
But, it's only after I graduated from high school, that I started learning and applying C# almost full time during higher studies, and that's what I considered to be my real start into programming and software engineering.
I learned a few lessons over the past decade, and I thought I would take a moment to gather my thoughts on these things. It took me about ten years and a lot of experimentation to figure out some of this.


1. Learning a programming language is the easy part: be aware and beware of the platforms
Take C# for example. Learning the C# language is not difficult. If you already have a good understanding of computer language fundamentals, and if you have some experience in other object-oriented languages, you can become a competent C# programmer within a few days, at least as far as the language itself is concerned. However, the real price to pay is not about the language, it's about the platform. To develop with C# on .NET, you need to know:
   - the .NET framework
   - one or more .NET technologies such as ASP.NET or WPF
   - and the Visual Studio development environment.
The time required to become proficient in .NET development is usually measured in months, even for an experienced developer. Learning a platform is always more expensive than learning a specific language, therefore choosing the platform is the most crucial decision.
Learning always has a cost and this cost is one of the key factors to consider when choosing the technology you want to learn. The real cost of learning is in time, learning always takes time. Since you do not have time to learn everything, it is important to think strategically about what you want to learn. And since the languages are easy, it's the platforms that you have to be careful about: the technologies associated with the language, the development and deployment tools, the operating systems, and other infrastructures.


2. I repeat, learning a programming language is the easy part: meet the underlying concepts of software engineering
The syntax itself, the words you use when applying the language are relatively simple and you can easily pick them up as you go. However, that's far from being enough for producing quality code, which often involve OOP and SOLID principles, unit testing, design patterns, TDD, BDD, and other technical concepts which are beyond the scope of this article. Anyway...


3. Actually writing code is only one (small) part of the job
A software engineer is often expected to be involved into technology research, tools and projects configurations, DevOps and admin tasks, debugging and testing procedures, documentation, and technical debt (fixing and refactoring existing code). Also, they have to be thinking about solutions and designing systems : sometimes the most important work is done away from a keyboard.


4. Tried and true : old and boring is sometimes the best.
It's not so much old vs new, or cool vs boring, but rather the thing you are most experienced with. As they say, I trust not the developer who practiced 1000 technologies once, but I trust the developer who practiced the relevant technology 1000 times. If the goal is to "just build the damn thing", go with a stack you would be most productive in.
For example, one of my contacts is making $25,000 per month with a SaaS that was built on boring ASP.NET+SQL Server+Angular 1 because that's what he knew. he hosts it on Windows because he knows how to make it fast and secure. He succeeded by focusing all his time on building the features that clients were asking for, instead of learning fancy tech.
It's important to realise that the technological treadmill never stops. Yet another JavaScript framework could have been launched while you are reading this. Today's cutting edge tech didn't even exist when I was getting started (EF Code First, Xamarin, ASP.NET Core, Razor), and this leads us to the 2 next points.


5. Focus on sustainable technologies
The only constant in the world is change. Actions and time management is an important skill for developers, particularly because we are on a technological treadmill that keeps moving or even accelerating.
For example, Web technologies that were popular around the year 2000 (Flash, ASP Classic and Java Applets) are becoming almost obsolete and decreasingly marketable. Today, we are talking about ASP.NET Core, SignalR, Angular2, React and VueJS. None of its technologies existed in the year 2000, and these new technologies are likely to be obsolete within 10 years.
What hasn't really changed? The fundamentals of languages such as C++/C#, their implementations of algorithms and their principles are still relevant after several decades. If you master the basics of a stable system, you could adapt to change better, you could appreciate it and use it to evolve.


6. Balance between exploration and exploitation
Exploration is about learning new things, studying new techniques, reading books, watching video tutorials, practicing and improving skills. Exploitation however, is to take advantage of what we already know to solve real life issues. It's about thinking creatively about ways to use the knowledge we already have to create value for others.
So yes, both of these tasks are both necessary and important. The risk is to be too focused on either activity.
Too much exploration, and you will never achieve a useful level of expertise in the chosen technology. There is a huge opportunity cost with this kind of light learning, because, although it expands your mind, the time it takes implies that you don't really improve on the skills that you have already acquired.
On the other hand, too much exploitation can keep you from evolving in new technologies, and can limit your employment opportunities.


7. It’s easy to be great... It’s hard to be consistent
It's easy to be great for 2 minutes. It's hard to stay great constantly, every day.
When you have a good idea for a new project, you feel a great desire to start researching, designing and programming. You feel a rush to turn your idea into something real and you become super productive. But the problem is that this motivation fades over time.
Yes, it's fun and it's easy to have new ideas and start working on them. But then there are the efforts to be made, the adjustments, the launch, the maintenance, the corrections, the improvements, and so on. Over several months. This is where it gets hard. It is hard to stay focused on the same idea, on the same project for months and years. It takes a lot of discipline.
It’s easy to be great. It’s hard to be consistent.


8. Diversify your skills
Don't be just a programmer, become an Expert Who Programs, an expert in another relevant field that you are passionate about. You can be an entrepreneur, a project manager, a Big Data scientist, a researcher, a security specialist, etc. If you are an Expert Who Program, in addition to being able to program (maybe full-time), you also have an additional credibility that is related to something other than software engineering.
Hence the importance of getting an education. If you go to university and you already know how to program, you probably won't learn much about programming. That does not mean you should not go to these schools. You will need some culture, and universities are great places to get that. You acquire culture by studying and understanding the world that humans have created, from different angles. It would be difficult to acquire this kind of knowledge if you do nothing but study programming.


9. Pick your niches and standout
The smaller the niche you choose, the greater your chance of being viewed as a standout in your field. It's very hard for a developer to become a standout in "PHP Web development". They're great, versatile, useful, but not noteworthy. One developer who knows how to work with these technologies, feels they are easily replaceable because there are so many out there with a comparable skill set. These areas are too broad for you to easily standout from the pack. If, on the other hand, you become known for a niche, like Xamarin.Forms or JavaScript Visualisations you're much more likely to be valuable to those looking specifically for that skills set.


10. Age of Skills
Information is the specific knowledge that you need to solve problems. Skills represent the ability to implement solutions using your knowledge.
In a world where most of the knowledge and tools are virtually free, what makes the difference? The skills, of course. We are no longer a knowledge-based society, we are a skills-based society. There was a time when almost all university degrees guaranteed a good job. Now this is no longer the case. Nobody cares about what you know. People care about what you can do. They pay you to do things, not to know things.


Teach yourself programming in 10 years.
Researchers have shown it takes about ten years (or 10 000 hours) to develop expertise in a field.
The solution is reflective practice: it's not enough to repeat the same things over and over again, but challenging yourself with a task that exceeds your current ability, to try it, to analyze its performances during and after, and to correct all error. Then repeat. And repeat again. It seems there are no real shortcuts. Learning through reading is good. But getting your hands dirty in practice is better. The best type of learning is learning by doing.
Personally, small projects and prototypes actually helped me improve. But there are still interesting things to master, therefore let's keep learning.

Tags: , , ,

Education | English | Technical

10 Ans De Programmation

by necemon 24. December 2016 04:04


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 ses 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 change' ? 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 dela 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.

Tags: , , ,

Education | Francais | Technical


I am Necemon Yai. I am a Software Engineer and a Digital Artist. Let's keep in touch via Twitter, LinkedIn or Facebook.

Je suis Necemon Yai. Je suis un Ingénieur en Informatique et un Artiste Numérique. Restons en contact via Twitter, LinkedIn ou Facebook.