A man once contacted me and offered to participate in a joint software project. At first, I misunderstood him and thought it is just some open source. I refused because have more important projects to work on. But we kept talking, I realized that the proposed project is commercial. The project didn’t look very promising, but I decided that it is better to share in some project money than nothing and finally agreed to participate.
I received access to a Git repository. I learned Django and thought that I will write half of the project. But… I am going to tell the story.
The first bug of his brain was that he repeatedly claimed that he is a better programmer than me and I am inexperienced in Python. I tried to explain to him that I know Python about 15 years but this was ignored and he kept repeating that I am not experienced in Python but he is a Python expert. (Huh? He even didn’t know version 3 of Python. Well, TBH he was an author of some quite advanced Python software.)
As a result, he wanted to write most software himself and to me it was left mainly the tasks of the server system administrator and tester.
But the remaining troubles were big:
We needed to accept payments in our Web application. I wrote the world best library for accepting recurring PayPal payments. It also has a pluggable architecture to be able to add other means of payments. But he decided: my API is too complex, recurring payments are not necessary (he wanted the users to pay manually every month), my code is too complex and he does not understand it, and also I am a bad Python programmer 🙂 Also he claimed that my code was not tested and had no demo (need to say that both statements were false?)
As a result, he dismissed my code and wrote his own primitive and buggy replacement. That one was specialized only for non-recurring PayPal payments done in the most primitive way with no pluggable architecture. He was able to do it only with my help. And it had a security bug namely a hacker being easily able to pay say $0.01 instead of the actual price. Later when I found this bug and reported to him, he responded that will fix it but he didn’t.
But the worst bug was that this his Django app had a circular dependency. I told him that circular dependencies are bad and this will cause problems in the future.
As the project admin, I found that sometimes database migrations fail with a weird error message. This was certainly a very big problem. Thinking about its reasons, I concluded that it is because of the circular dependencies. I requested to remove circular dependencies, but he refused and instead wrote two scripts: that exports the data from the DB and that imports the data. It was meant to use these scripts instead of Django migrations.
The troubles were:
- It exported only a part of the data, the rest of the data were lost on every upgrade.
- Both export and import were to be run manually from command-line. My note that it is to be automated was ignored.
- After the import it was necessary to correct the database necessary by some sequence of different steps.
In other words, I needed to stop the server about once per every day and work half of an hour to do this manual operation with some complex sequence of steps.
All my complains were ignored and instead, Django was (falsely) blamed for being buggy about migrations.
In the meantime, this “bad programmer” (me) 🙂 created another Django application, for my own nonprofit project. While deploying it on my production server, I met a similar problem with migrations. “Is Django really buggy as he supposes?”, thought I. But after investigation I found that I too have one big stupid error: I used to run the command
makemigrations on the production server. Now I know it should in no case be done. But I was yet inexperienced with Django that time. After fixing problems with that my nonprofit application started to work. I met one more problem with it. The production server refused to migrate once more and failed into a non-runnable state. As it turned out it was a rather serious bug in MySQL, which I reported then. These problems were finally solved by moving the database into PostgreSQL.
I told Iury that I finally found the reasons for the troubles with database migrations: They were both him making circular dependencies and me running
makemigrations on the server. I expected that now we are done with our troubles and can start selling soon. But he was different: Instead, he kept to claim that Django is buggy, that his solution with JSON export is good, that Django is wrong not supporting circular dependencies and this is a bug of Django. Moreover, he invented his own explanation of the trouble with migrations: that it is because of his script that erased all data from the DB tables (for testing purposes). In a sense this was true: this script was used together with
makemigrations command and thus inevitably caused this trouble. But I was unable to explain to him that his command is just one of the several causes and all of them need to be fixed.
He (almost the world best programmer in his opinion) also kept saying like that migrations are a too complex thing and he cannot do it. He claimed that data migrations can be done only through his JSON hack. I tried to explain that the Django system of migrations is Turing-complete that is anything is possible to be done with it, but… you know. As the response, I said I will do it myself, without his help. He answered that it cannot be done. I also told that I did such a thing with my nonprofit project already. As my response back, I did it for our joint project too. But… he refused to check in my code and insisted to use his JSON hack.
Finally, I forked the project in the hope that I will take his code (to be honest, long and rather advanced) and finish it myself. His response was rather hysterical. But in no way he agreed to collaborate with me.
Telling about the story of our joint venture, I skipped that he lost his job and survived only for my money which I sent him regularly as a (unreturned) debt. But even facing the danger of death from hunger, he preferred to keep his pride and no agree to incorporate code for such an “inexperienced” programmer as me because he is experienced and knows better.
Among other troubles, he for a long time was refusing to upgrade Django libraries to a newer version. He claimed it is too complex and would take a month. As expected I did it less than in one day. But to do a thing is not enough, need to make it published. This time after some efforts a time passed I overcame his pride and made him agree to incorporate version-related updates into his codebase.
There were other troubles, too: For example, he forced me to agree to buy for him a paid Git hosting while there is a free one: He blamed BitBucket to be buggy (certainly it was either a bug in his own IDE which he developed and used himself or a bug in his brain directly). He sent me countless WhatsApp messages ignoring my protest to stop writing and responding me back always with the words “Stop it!” (that is to stop stopping him writing) when I called him to stop, and also called me sometimes at night. It was necessary to block him. He spent to much time in optimizing already quickly enough running code despite me asking to do something more useful.
Realizing that he dies from hunger, he after much tension accepted my proposal “I will work with you only if you follow all my commands.” (Earlier I get from his the promise that I will be the CEO.) But later he amended this agreement that it was “not about technical matters”.
To his praise in some way he several times almost succeeded to get investment into the project (we needed money for SEO; by the way, he kept insisting that I should buy Google Ads). Probably it was because he praised this mediocre both in the idea and in the implementation project as something great. But he again failed his own accomplishments: When we spoke with the investor, I needed to say that he cannot make decisions, despite he is the main programmer of the project and writes the code, that he can work only under my supervision. He protested and we lost the investor: “I see you guys don’t work in agreement.”
I tried to finish his code myself. I plugged back my PayPal code instead of his broken PayPal code. The software stopped to work. I tried to fix the bugs, but after a more scrutinized investigation realized that his code is not enough clean and also much repetitive. At this point, I really despaired with the project, stopped it and deleted the server with all the files.
That’s the history of the world worst software startup.