[How Coding in Python Might Be Bad For You]

Java C++ ActionScript Added on 10/04/2016

Python questionmark logoWith the growing power of computers, scientists across all fields are starting to appreciate computer modelling as a valuable tool for their research. A particularly favoured language is Python, as it is easy to get into compared to other, strongly typed and compiled languages, like C++. Consequently, because of Python's popularity, there is a great number of code libraries and tools one can use for free. I myself use Python for analysis and visualisation of simulation results (I write my simulations in C++ though). I have also been exposed to using Python during a couple of commercial projects.

The momentum that Python has these days, both in science and in the software development industry, worries me. I have seen many programs and have worked with many programmers during my career as a software developer. I often struggle to explain to fellow scientists and programmers why I think Python is bad. Today, I would like to share the following analogy:

Imagine that you are writing an essay for a coursework during your degree. There are good and bad courses and there are good and bad teachers. I'd like to argue that coding in Python is like writing a really bad essay and getting away with it. Here is why:

1. No structure

No structureYou are allowed to write your essay with any structure you want. You skip an introduction and go straight to your main arguments. You then mention a couple of references in the end. You get a B, which in your mind validates this approach to writing essays.

In Python, it is very easy for your code to become a mess, especially if you are accustomed to the fluidity that Python allows. There is no pre-scribed structure to a program - you can write in-line code, you can put it into functions or into classes. What can end up happening in bigger projects is that there is a mixture of everything. This makes it really hard
to read and maintain complex programs.

2. You are allowed to redefine words and say things that are not true

You are allowed to redefine words and say things that are not trueIn your essay on African animals, you say that termites are social insects and than rhinos are mammals. A few pages later, you claim that ants are really stones and that rhinos can fly. You get an A - what a creative way of thinking about reality!

In python, a variable can change its data type during run time. Or, a parameter to a fuction can take on any data type, determined at a run time. Consider the following code snippet:

def whichWeekDayIsIt(date):
   """
   A function that returns name of the week
   day, based on a date.
   """

It is simple enough to understand the function signature right? Yes, until someone changes the body of the function to cover cases when date is not a single date, but a list of dates. You can then end up calling the function as


myDay = whichWeekDayIsIt(date = [01022016, 02022016])
The parameter name 'date' looses its original meaning (a similar thing would happen if you changed the parameter name to 'dates' and then wanted to call it with a single date, not a list). Because variables have no datatypes, you basically either have to call variables in a very generic way, defeating the purpose of naming them, or call them in a way that is only partially true.

The second problem with having no data type is that when it comes to passing variables into functions, you have to rely purely on documentation of that function to determine what you should pass in (which, more times than I am comfortable with, is missing in open-source libraries). Alternatively, you have to look into the body of that function to see how a particular parameter is used and to deduce what data type your variable should have. This is sometimes really difficult.

3. The meaning of words changes based on the amount of spaces in front of them

The meaning of words changes based on the amount of spaces in front of themEveryone makes mistakes during typing. But in the essay for this course, a word " dog" that has one space in front of it means a dog, while the phrase " dog" (two spaces) means a flying saucer. Unfortunately, your word editor does not highlight multiple spaces as an error, which means you end up writing about UFOs, while what you really wanted to do is describe your pet dog.

This is one of the most annoying things about Python for me - indentation, i.e., the use of white spaces at the beginning of code lines, defines what part of the program a line belongs to. It is isn't just the fact that it slows coding down during "dirty-editing" of new code. This reliance on indentation alone is potentially dangerous, as it allows you to create logical bugs that are difficult to spot. Consider the following code snippet:

numOfDrivers = 0
for car in cars:
   print("car {}".format(car))
   numOfDrivers += 1

The number of drivers will be equal to the number of cars. Now imagine you are editing the code and you make the following indentation mistake:

numOfDrivers = 0
for car in cars:
   print("car {}".format(car))
   print("something else")
numOfDrivers += 1

The number of drivers will now be 1. It is possible that you will not realise this mistake until your code delivers unexpected results. In the worse case scenario, you will never go back to your code and you will make incorrect conclusions based on your results. For example: "For every ten cars, there is one driver, we must have self-driving cars on the road!"

Let's compare this to what happens in other languages, like C++, Java, etc.:

numOfDrivers = 0;
for (i=0; i<cars.length(); i++) {
   print("car {}".format(car))
   print("something else")
numOfDrivers += 1;
}

Here, the same mistake of unindenting the line that counts the number of drivers was made. However, because the code has a stronger structure and uses the curly brackets { } to identify the code block in the for loop, the resulting number of drivers will still be correct.

4. The only feedback you get is that you failed or passes your course

The only feedback you get is that you failed or passes your courseYou cannot ask your course coordinator about your research for the essay, because he is too lazy to answer his emails. You spend weeks writing your essay, submit it and fail the course when it's too late to change anything.

Python has no compiler. It means that you can simply run a Python program without the extra step of turning code into an executable file. Yes, it may be faster to develop (small) applications this way. But in the long run, it actually makes you less productive. I lost count of how many times my program failed after an hour or so of running, because of some simple typo that a compiler could have picked up straight away.

5. Lack of control over volume

Lack of control over volumeYou need to print your essay to hand it in and you are allowed any formatting you like. Because you have absolutely no idea about how printing works, your essay ends up being triple spaced, with headings that span across pages. When you print it, it takes up a whole room.

Python leaks memory badly. Have you ever tried running a program that takes a few hours to execute and produces a lot of graphs using matplotlib? Python, like other languages that use a garbage collector, was designed based on the philosophy that it is the computer, not the programmer, that should decide how memory is allocated and when it is freed up.

What this means in practise is that it's very hard to optimise memory usage. Sure, things run smoothly for simple programs that show off a Hello world message and maybe calculate a few things. For a scientific application though, that requires complex computations and uses big data, this can become a problem very quickly.

6. Each sheet of paper is from a different manufacturer. Your printer dies horribly.

Your printer dies horriblyBecause you do not produce your own printing paper, and because paper is really hard to find in bulk, you have to go on the Internet and buy individuals sheets (so you can print out your thousand-page essay). Some paper manufacturers are very bad at their job but no one knows about it. One partcular sheet had stone fragments in it and broke your printer.

It is very common in Python to use libraries, mainly so that your application production is faster, or because some people truly know better how to write code. However, the curse of open-source applies to program libraries too. Not everyone knows how to code efficiently. Almost no one, from my experience, knows how to document things properly.

A python application may be using 20 other libraries to do what it's supposed to (because, let's face it, Python by itself doesn't support much). You end up installing libraries all the time, especially when you pick up someone else's project. Libraries often depend on other libraries than depend on other libraries. My laptop has become a mess since I started coding in Python, I must have installed at least 30 libraries to finally get some code running.

Secondly, most libraries are made by people like us, who are simply trying to get by writing code for their own application. Some of those people are kind enough to want to share their code, but they often do not go the extra mile to make their code usable in general. Poor documentation, lack of naming conventions, and other bad coding practises are very common.

7. You are in a community of false novel writers

You are in a community of false novel writersYour fellow classmates also have to write their essays. As do many other people on the Internet. It feels to them like they are writing a novel, or even a trilogy, and they often truly believe that they are professional novelists capable of producing masterpieces. In really, some of them have never even seen a novel.

The Python community feels very strange to me personally. Python claims to be a language to fit all purposes, it is functional, it is object-oriented, it is for simple utility scripts and it is used for working with big data. I have particular experience in Object-Oriented programming (OO) and I have seen OO in Python, C++, Java, Objective-C, ActionScript, JavaScript, PHP, etc. Like in PHP, for example, OO in Python is not fully implemented. For example, encapsulation, one of the basic principles in OO is non-existant in Python. The fact that you can create objects in a language does not make it a proper OO language.

And that's ok, when everyone understands what a language is suitable for. PHP programmers will not claim that their language is for anything else than coding web sites. Python programmers, however, seem to think that their language is the answer to everything. If they remain within their niche community, they will never learn aspects of coding that are not present in Python, but are important in general.

Conclusion

Just like any other programming language, there are things that Python is good at and things it is bad at. I find it a great tool for writing initial exploration code, or small scripts to maintain large numbers of files and directories. Also, I use matplotlib extensively as it can produce some really nice graphs with relative ease.

The reason I have a problem with Python in general is how it is used. I do not find it efficient and I therefore find it difficult to understand why people want to teach it to data scientists. I do not find it well structured and because of the reasons I list above, I think it encourages bad coding practises. That's fine if you are coding small applications alone. But for a big project, Python code can become a big mess very quickly, unless there is an experienced programmer to guide the development process.

In science, I think it is up to the people with a richer software engineering background to encourage others to learn good coding practise and to use languages more appropriate for big applications (like C++, Java, C, etc.). Yes, it is hard to get started with those languages. It is hard to understand memory management and it takes years to build up a sense of what is good and what is bad coding practise. But in the long run, more structured languages provide a safer and a more robust environment for turning ideas into computer programs. Let's not write bad essays and pretend they are best-selling novels. Let's build up our skills slowly from the ground up, so that when we finally want to write those big novels, we can do so properly. 

Did this article interest you? Have a look at these!

pyCreeper: A python library for making plots easily and cleanly.

Object Oriented Software Development (In Python): Tips on making clean OO code in Python


Image sources (in order as they appear on the page):
http://www.pythondoeswhat.com
http://gailey.org.uk/?tag=/unstructured-data
http://www.smosh.com/smosh-pit/photos/12-more-bizarre-mutant-animals
http://www.clipartpanda.com/clipart_images/a-survey-clip-art-image-8637850
http://www.nooooooooooooooo.com
https://buffetoblog.wordpress.com/2011/11/14/caption-contest-woman-surrounded-by-paperwork/woman-at-desk-swamped-by-papers/
https://www.pinterest.com/lauriuetc/explosions/
http://www.youlifesuccess.com/3-quick-tips-on-becoming-a-great-public-speaker/

Comments

George
[28/12/2021]
[WEB]
Python teaches bad habits. I can't count the number of people who don't understand data encapsulation and why they should have member functions to access class variable. Instead their answer is inherit the object.
Another favorite. Not considering performance. Always spouting preemptive optimization. They get to the middle or end of the project realizing it would be extremely difficult to go back and restructure everything for performance and quit.
The number of python libraries that implemented SDL horribly is nuts.
That doesn't even go into the language issues of GIL threads or overhead of processes messaging and anything along that line.
It doesn't cover the fact there is no real encapsulation python.
SG
[17/10/2020]


Lack of semicolons and curly brackets is reason I dislike Python. It makes code less readable and have potential for logic errors.

I also don't like how it become first language for everyone. Everyone by default learn python now, without even knowing purpose WHY they learn language. Cuz everyone doing it. Instead I think, you need to learn language for a specific project. I would only learn python if it's needed for that project, but use anything else if possible.
K
[24/04/2020]


I agree - same diagnostic here.
Not to mention the so called "simpler" code:
simpler really means "shorter" but definitively it is harder to understand, impossible to debug easily, type unsafe or "dynamic" if you prefer, etc...
The python environment dependencies problem is worse than in java
The libraries are of low quality
as mentioned making the format a part of the code is a terrible idea too with undetectable errors.
definitively not a good language for enterprise backend
I believe part of the same can be said too of javascript on the backend side, but definitively python is worse because of the indentation problem and the heavy use of cascade calls functional style
Dr Who
[07/04/2020]
Showing my age, but Fortran had variables that were "automatically typed" based upon the first letter of the variable. A typo, such as imac vs iamc could take hours/days to find, and there is probably code out there that such typos have never been found (for many reasons).

Bringing back things that were proven to be detrimental to software development and design is insanity. There is an old saying: "If you don't learn from the mistakes of the past, you're bound to keep repeating them"
Ali
[07/04/2020]
The notion that "everybody can program" and "Python for everyone" is a fallacy! I agree with you Lenka, poorly written code is something I encounter everyday. Up to last year I was teaching in university and many students came complaining about their grades (programming subject)! Their argument is "it works! Why didn't you give me an A?" They think just because it works then it's OK!!
Unfortunately, such trend is becoming popular with a language like Python. I fully understand that this is very good for prototyping or doing small-size projects. But adopting this for A.I. and Big Data Analytics is a crime! The resultant systems are so fragile, prone to errors and forget about the concept of "Software Engineering". Trying to modify or debug Python code with its "dynamically typed" variables and out of the norm syntax is a nightmare, at least for me! Funny library names, supported by unknown entities with even funnier method names is supposed to be good!! Worst yet, is package dependencies. It took my team almost a month to find a "working harmony" for machine learning system that uses many packages. Using a different version number for any of those packages will just break the code!! Yes, Python community is so happy about their PIP installer and how easy it is to "install" anything. In reality, when you have several packages, it's nothing but a disaster!.


{Please enable JavaScript in order to post comments}

Top 5 Things I Wish I Knew When I Started a PhD

In a short moment self-reflection, I made a list of the five most important things that doing research with a lot of data has taught me. And I learned the hard way - wasting a lot of time and energy re-doing things instead of being smart about it at the beginning. Note to self: I should read this once a year or so.

Getting Started with Creeper

This tutorial helps you to create your own Java project with Creeper. As an alternative solution, you could simply download Creeper with the Demo project and rewrite class and package names within net.lenkaspace.creeper.demo to suit your own needs.

A small compiler script for C with GCC

One of my favourite classes at the moment is the one where they teach us C. Knowing C already, it is a nice relaxation for Monday morning...

pyCreeper

The main purpose of pyCreeper is to wrap tens of lines of python code, required to produce graphs that look good for a publication, into functions. It takes away your need to understand various quirks of matplotlib and gives you back ready-to-use and well-documented code.

Novelty detection with robots using the Grow-When-Required Neural Network

The Grow-When-Required Neural Network implementation in simulated robot experiments using the ARGoS robot simulator.

Fast Data Analysis Using C++ and Python

C++ code that processes data and makes it available to Python, significantly improving the execution speed.