Choosing a new programming language to learn
In engineering school (elec/info oriented cycle), I had the opportunity to learn programming languages rather low level C embedded (on PIC and STM32 micro-controllers - following an assembler initiation module), C (including system programming under Linux), C++, VHDL (a hardware description language and not a programming language to be precise) or higher level like Java, G language (from LabVIEW) and SQL (basic modeling and querying).
As far as computing is concerned, during my studies I had the opportunity to discover :
- the world of low level programming (and yes still useful and necessary today!)
- the world of higher level programming
but also different programming/design paradigms:
- imperative/procedural programming: C
- imperative / object-oriented programming: C++ / Java
- declarative programming / data flow : LabVIEW, VHDL
- declarative / database-oriented programming: SQL
- parallel system programming and design: Sequential Function Chart (GRAFCET), UML activity diagram, LabVIEW, VHDL
- Model-View-Controller programming (architecture): Java (Android)
- network design/programming (Cisco)
- design related to the field of automation: state machines (FSM), combinatorial logic, sequential logic (GRAFCET), control/servo-control
- algo-oriented programming/scripting/calculation/scientific modeling: Matlab / Simulink
A training course cannot cover all the languages existing and used on the market at the moment t but prepares the student by familiarizing him/her with various programming/design paradigms; subsequently, learning a new language will be facilitated.
Having studied in elec/info, the languages chosen for teaching were oriented in this direction; thus I did not have the opportunity during my education to learn :
- web frontend programming
- web backend programming
and of the blow misses with the call: html, javascript, css, php or other...
but also :
- the languages of the world of data analysis, machine/deep learning : R and Python
During my final year internship at Orange Labs, I learned and used the Perl scripting language. It's a rather particular scripting language: it's a scripting language that I would say is inspired by the C language and not C++ (because not naturally object) and directly designed to manipulate strings (regular expression, substitutions...). It's a language that has found its public with system administrators but also simply people who need a language able to manipulate texts. Personally, I have indeed found this language powerful for that, however it has in my opinion a major drawback: the code becomes very quickly unreadable even for the person who wrote it... So I would say that it is a very good language to write a text processing tool (and that's why I was using it) but as soon as the program is too complex, it becomes unsuitable because it is too quickly cryptic and it is not object-oriented. Ok you can develop complex thing without OOP but it provides a useful way to structure your code efficiently and thus a better way to manage the conceptual complexity of the problem to solve.
After that I joined the ICT of STMicroelectronics in Crolles and I quickly had to manipulate SQL on large relational databases (Oracle); what changes with what is seen in school is the complexity of the schemas and the volumetry (basically you can't make the query as you want, you have to understand the modeling and go through the right entries). I also learned the R language; a programming language designed for statistics and data analysis. This scripting language is designed to handle dataframes and it does it very well. However it is not a language designed by developers and it is really calibrated primarily to develop "small" statistics-oriented scripts.
I later had the opportunity to develop with the C# (.Net) language. This language is if I can say so, a remake of Java "made by" Microsoft (and initially primarily for developing applications under Windows). I had before developing in C# a bad a priori (especially because it is a Microsoft language). And I can say that I was pleasantly surprised; basically C# is a much better Java! And Visual Studio is a pleasure to use.
At the same time, I wanted to discover (not necessarily to make it my job) this mysterious world of web programming... So mysterious it's a bit exaggerated, when I was younger I had already tried the web but with WebPlus 10 (software that allows you to graphically define a site) and then with WordPress (CMS). But I had never coded myself neither the backend nor the frontend. I also wanted to start a small home automation project (with sensors and a raspberry pi), which gave me the opportunity to discover this field by developing a web interface for this application. I still had to choose a technology for the backend. So I first thought about PHP, which is widely used to make websites, Ruby on Rails, JEE (used in companies to develop big websites) and ASP.Net. Well to tell the truth ASP.Net was too Windows oriented (which is not totally true anymore with ASP.Net Core) and I wanted to work under Linux. Ruby on Rails seemed interesting to me but I was still a bit afraid of the simple fashion effect. The ecosystem around JEE seemed to me to be too big project-oriented and I'm not a convinced Java user (in fact, it's easy to see the limitations of Java's GCs, which you can change and set up, but having to do that is bad enough, and the language is a bit old, I think). There was then PHP that I tested at first, then I started to compare the (too?) many frameworks available in PHP (CakePHP, Symphony...). But then I came across a Python framework allowing to develop websites : Django ; and there, to my surprise, I discovered that Python could also be a good language to make websites and web services (with Flask, Bottle)... I knew the Python language widely used by people developing around Raspberry Pi (lib to access GPIO ports for example...). Moreover, even if I had to learn a new language, I thought it would be smarter to learn a polyvalent language; a Swiss Army knife language; that way, learning for this project would make it easier for me to reuse my new knowledge! So I learned the Python language and made my project in Python with Django / MariaDB / html / javascript (mostly js libs: bootstrap, jQuery, propeller, c3js) / css (a bit...) / Gunicorn / Nginx.
Afterwards, I had the opportunity at work to use Python on different occasions and in various projects :-) (automation of interaction with a website, mini web services, IoT, Machine Vision, Deep Learning)! The results of this self-training (on my free time) and of this home automation project have been very beneficial and by reusing this language in new projects I could really progress in the use of this language.
So today I could describe Python in the following way:
- a scripting language available on different platforms
- a strong typing language: i.e. python will refuse to mix cabbage with carrots at the execution...
- it allows object-oriented programming but does not impose it
- a language that is as well equipped to create small scripts used to automate tasks as it is to build complete applications.
- A Swiss Army knife language: there are packages to do everything - easily!
- a language with packages that are often well built and well documented; it is indeed a developer's language
- a very good rapid prototyping language
- a very readable language :-)
On the other hand this language has some defects (yes!):
- a language with dynamic typing :-( ; certainly can make life easier for beginners but very quickly we would prefer a language able to determine immediately a type bp and not just when we execute the line of code...
- an uncompiled language : here again logical since it's a scripting language ; but we quickly realize that a good compiler is sometimes also useful to detect problems before execution ; so we can quickly waste time testing applications.
- a language therefore interpreted => slow to execute
These drawbacks are to be qualified all the same:
- contrary to other languages, the python is very readable, has few (no ?) traps
- as a well equipped tool it allows to write quickly a solution to a problem
- IDEs such as Visual Studio Code and Pycharm detects quite well (especially with a type inference system) the problems...
- for the slowness of execution: in fact when making "big" calculations, we use python libs developed in c/c++ and therefore very fast; only the switching is in python; not the calculations. But if you make too many loops and too many calculations in Python you risk paying for it with significant execution times.
And today history repeats itself... Two years ago I wanted to learn a new programming language. I wanted it to be versatile, readable and cross-platform; I then decided to learn the Python language; today I would like to discover a "modern", safe and fast programming language. If you look at the current technological landscape, you will find different names:
- D language
- C# language (yes yes ! .Net 5 will be really cross-platform; this opens new possibilities to this language) -> I have already used it in project but my goal is to learn a new language
- Rust language
- Kotlin language
- Go language
- Julia language
Of course, this list may not be exhaustive.