[Tweets]

15/08/2018 5:16pm
An exciting opportunity to do a well-funded #PhD at the University of Bristol, working on hybrid #autonomous system… [LINK]
08/08/2018 7:25pm
RT @RoboticsWoE: Robotics Teaching Jobs at University of Bristol [LINK]
08/08/2018 7:23pm
RT @SwarmDynamics: From #BEECLUST to BEEPOST (Ogunsakin et al.) a distributed architecture Self-Organizing Flexible Manufacturing System (…

[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

Lenka
[10/07/2018]


Wow, that's eye-opening Dr Who, thanks for sharing here! I did wonder when the Python bubble would burst, seems like it started happening?
Dr Who
[09/07/2018]
From what I have observed, colleges that use Python graduate students that don't understand how a computer works, nor can they really code anything efficiently. A very good friend of mine is a senior manager at a BIG name place. He has stopped interviewing students who graduate from Python-based schools --- just tosses their resume in the trash. After numerous interviews where the student couldn't say what a byte was, nor other simple things, he just gave up wasting time.
John
[01/07/2018]
I completely agree with you. Python is good as a scripting language and nothing else, it should stay that way and keep out of other language domains.
Kabir
[27/06/2018]
Absolutely agree. I started programming with C and then went on to python, I had quite a tough time understanding OOP in python. So in order to understand OOP I had to learn Java and by understanding how Java implements OOP helped so much. The way python is growing worries me too. Python was originally designed to be a scripting language so obviously it should be used only for that purpose. Just like it would be a bad idea to use Java to write a small 'hibernate my computer when idle' script, it would be counter productive to implement large scale objects using python. And these days python is adding all kinds of features to beat the competition, it wants to be object oriented, functional, and what not, but it should only do one thing and should do that one thing perfectly. Like a good poem is that which conveys one meaning and one meaning only, not 2 or 3 or more.
Some Chinese language learner
[06/05/2018]


Or maybe I can't concetnrate because of war.


{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.

Creeper :: Getting Started

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.

Designing Robot Swarms

This project looks at the challenges involved in modeling, understanding and designing of multi-robot systems.

Robustness in Foraging E-puck Swarms Through Recruitment

Swarms of five e-puck robots are used in a semi-virtual environment, facilitated by the VICON positioning system. Recruitment can make swarms more robust to noise in robot global positioning data.