New release of Magic

I just created a new release of Magic. One of the primary features, is to make its codebase completely modularised, and creating NuGet packages for every single module in the project. This implied creating more than 20 NuGet packages for the record, so it was a substantial job for me. This allows you to use Magic in existing (legacy) code bases, by simply referencing the “magic.library” NuGet package in your project, and including the “files” folder from Magic in your own existing ASP.NET Core Web API. Read more about how to accomplish this here. Although I want to emphasise that I would encourage you to download the entire code base, since it contains the necessary frontend parts to “crudify” your database.

I’ll probably end up creating some more instructional material over the next couple of weeks, but for now I’m heading to the beach 🙂

Anyways, have fun!

Neither for Free, nor for a Fee

So I have been thinking a lot about prohibiting usage of my software by vicious governments, and other organisations being in violation of United Nation’s Universal Human Right declaration – In fact, I have thought about it for a very long time. So here is my current proposal for a software license, that arguably gives me the best of three worlds. First the ability to share my source code with the world. Secondly it prohibits vicious governments to use my work in any ways. Thirdly, it must create the possibility for me as an individual to create a sustainable income, by making me able to charge people using my software commercially in closed source applications. My intentions are to create a Dual License, that prohibits usage of the software unless two criteria are met: 1. The user creates Open Source software. 2. The user does not work for an organisation that is either directly or indirectly working for a government or organisation that are in violation of UN’s declaration of Universal Human Rights. Neither as a direct employer, or as an independent sub contractor.

The first point (forcing the user to create Open Source), is a demand I will wave for a fee, for users wanting to create closed source applications. This allows me to “Dual License” my software under “Quid Pro Quo” terms. However, the second demand will not be waved, resulting in that I will not sell closed source usage rights to individuals or organisations if they are in violation of Human Rights according to UN’s definition, or working for an organisation or government violating Human Rights. The idea is to keep it as simple as possible. I wanted to use an exception to the Affero GPL, but the Affero’s wording is simply too complex. I want something I can explain to a child, while still fulfilling the above intentions of mine. I am not sure if I have succeeded, but you can see my current working draft below.

Before you object; Yes! I do realise that this does not make the software “open source” or “free software” according to the OSI and FSF’s definition. However, I quite frankly don’t give a shit! Sorry, I will not work for your fascist government, neither for free, nor for a fee. OSI and FSF can quarrel about the semantic differences between Open Source and Free Software – As for me, I am creating Freedom Software … 😉

Freedom Software license version 1.0

Copyright [YEAR] [COPYRIGHT HOLDER]

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and its associated documentation files (the “Software”), to use the software for any purpose, subject to the following conditions:

1. The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
2. The entire source code for your own work that builds upon the Software either directly, or indirectly, should be published such that it is easily available for everyone.
3. All copies of the Software should clearly display a hyperlink/URL whenever it is interacted with by a human being, that allows the human to easily obtain the entire source code for your entire application, and use it under the same terms as you were given the right to use the Software.
4. You or your employer are not in any ways participating in activities that violates the United Nations Universal Declaration of Human Rights (https://www.un.org/en/universal-declaration-human-rights/).

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

The Hippocratic Affero GPL addendum

Some time ago Coraline Ada Ehmke created a Hippocratic MIT style Open Source license, and the Open Source Initiative explicitly commented on it, and said “it is not open source”. For me personally, Open Source and Free Software is not a goal, it is the means. The means to accomplish good things, and our reasons to create Open Source software, is because we (developers) wants to contribute positively to the world. Hence I don’t care what the OSI thinks about the Hippocratic Addendum to Open Source licenses to be honest with you, I intend to use it for my own software regardless of whether or not technicalities makes it an “open source license” or not.

The next release of Magic will therefor be released under two distinctly different licenses; One “quasi open source” license, the Affero GPL license with the “Hippocratic Addendum”. And another commercial/proprietary enabling license. I allow you to use the first license because I want to contribute to the world, and do my part in making it better. I sell the right to use Magic under the seconds type of license, because I need to pay my rent like everybody else. I also do not sell proprietary enabling licenses to governments or organisations who are in violation of international human rights, by for instance having a military presence in a country without a UN resolution underneath backing their presence, etc. Sorry, you can use something else do – But you cannot use Magic. If you don’t know what the Hippocratic Addendum is, you can find it below.

The Software may not be used by individuals, corporations, governments, or other groups for systems or activities that actively and knowingly endanger, harm, or otherwise threaten the physical, mental, economic, or general well-being of individuals or groups in violation of the United Nations Universal Declaration of Human Rights. Read more here – https://www.un.org/en/universal-declaration-human-rights/

You can read the UN’s Universal Declaration of Human Rights here.

Thank you Coraline for a great idea!

Adding more developers to an already late project

This is a variation of the Mythical Man Month, and probably equally unintuitive. However, the research in this area is bulletproof and has been verified thousands of times by independent researchers, and its conclusion is “Adding more developers to an already late project only makes it later.”

The reasons of course includes that you’re forcing your only productive resource to spend precious time teaching the new developers to understand the existing codebase, in addition to that now the project requires overhead, coordination, and collaboration, adding to its overhead – So while you believe that you’ll be able to finish faster, the exact opposite is the result.

If your job is to move 1000 bricks from A to B, and you’re late, adding more manpower to the job obviously results in finishing earlier. Hence, human experience have taught us that adding more manpower to a job, results in finishing the job faster. Therefor, when a manager is faced with the prospect of not finishing the software project in time, his intuition is to add more manpower to the job. However, you’ll only make it later. Understanding this though, and believing in it, requires huge amounts of experience – Experience most software development managers don’t have. In addition it requires courage, courage to say “NO” when your investors and CEO are telling you to add more resources to your team. However, a mature and experienced software development leader will easily be able to explain this fact to his managers, allowing for the project to finish as fast as possible, without adding to the cognitive load of his team, by adding more manpower to an already late project.

There exists many reasons to hire more manpower, but making the project faster, is not one of those

Recruiters, you’re doing it all wrong

I just declined my “dream job” in Norway. A really great company, with an awesome idea, promising me large autonomy, for doing things “my own way”. They were also going to pay me €150.000 annually. My reasons for declining it? I couldn’t afford it. Now for the record, the base salary was €120.000, but knowing myself fairly well, I’d probably bring in at least €150.000 annually after bonuses and overtime was calculated.

Before you start objecting to me being an a$$hole, all greedy and such, please let me inform you about that I currently earn only a fraction of the above salary. Accepting the above job would imply me raising my salary at least 3x compared to my current salary. However, I live in Cyprus, and adjusting for a completely different set of taxes, and an entirely different set of living costs, the €150.000 in salary I’d be given in Norway, would effectively have resulted in that I’d have to significantly decrease my living standards, to the point where it would hurt badly.

Hence, the end result would be that I’d be forced to move from 9 months of summer to 9 months of winter. Dark and cold most of the year, living in a one bedroom apartment,  instead of living in my 4 bedroom dream mansion in Cyprus, on the middle of the square, of the most beautiful village that exists in Cyprus, only 25 minutes outside of Limassol with a car. I’d have to shave my living costs to the point where it would hurt every time I went to a restaurant, since a visit to a restaurant in Norway, easily would cost me some 3-5 times as much as it does in Cyprus. For a third of the above salary, I can easily go to restaurants 3 times a week in Cyprus, after having paid my expenses, without really noticing it even. And yes, my wife doesn’t even have to work – Her job is basically to make my life comfortable, serve me dinner when I come home, and make sure the house and yard is tidy – In addition to feeding our cats 🙂

In case you don’t understand why, let me inform you. I am from Norway, and I’ve lived most of my life in Norway. If I go to a bar in Norway and buy myself a pint of beer, that’s somewhere between 9 and 12 EUROs. In Cyprus it’ll cost me between 2.5 and 3.5 EUROs – The exact same beer!

In Cyprus I have about 20% tax, in Norway I’d end up paying almost 50%. An inexpensive 2 year old second hand Toyota in Norway; Cashing! Easily €30.000. In Cyprus I can buy myself a new Mercedes for the same price!

If I was a recruiter, instead of trying to headhunt people from abroad, to convince them to move TO Norway – I would spend my time trying to get Norwegian software developers to move FROM Norway, to continue working for their Norwegian employer. Why? Because they could easily cut salary costs in half, have the developer register some offshore company, eliminate employment fees (an additional 25% reduction of costs) – And completely get rid of social costs. The employer would basically save some 75% of his costs for employing the same person, and the employee would feel as if his salary had doubled. Since Cyprus is a member of the EU, this is really quite easy in fact, and perfectly legal too may I add – And according to my own accountancy, an invoice from Cyprus to Norway doesn’t need to even add VAT, since you only pay VAT inside of EU from Cyprus, and Norway is not (full) member of EU, but only member of ECU.

If you’re a headhunter, wanting to hire me for a Norwegian company, to move to Norway – I’ll need at least €300.000 annually to justify it economically to myself. If you want to hire me remotely for a 4th of that price, I’d love to talk with you though. In case you don’t understand why, let me explain it to you, by giving you an estimate of what I’d have to pay for simply living in Norway, with a decent living standard.

  • 3-600 EUROs per month in toll roads
  • 50% tax
  • 25% vat
  • 500% “special tax” on everything considered “luxury items” (cars, liquor, tobacco, etc)
  • €4.000 – €5.000 in rent per month to maintain something resembling my current €750 “mansion” in Cyprus
  • €300 per month for a bus card
  • “Everything” being 3-5 times as expensive
  • Etc, etc, etc …

Sorry, but I simply cannot justify it financially moving to Norway without making at least somewhere above €300.000 annually … 😦

In case you still don’t get it, let me explain to you what me and my wife has planned today. I’ll pick her up after work, and we’ll go to a nice restaurant in Pissouri Bay. Afterwards we’ll probably bring a bottle of wine with us down to the beach, where we’ll probably end up swimming in the dark. The wine will cost me €3, the dinner roughly €25 for the both of us, and the water will be roughly 25 degrees Celcius. If I was to do the same thing in Norway, a bottle of wine would cost me some €15, the dinner would cost us some €80, and the temperature of the Sea would be roughly 15 degrees Celsius – Below you can see a photo of where we’re going to go swimming, only some 5 kilometres away from where we live – Sorry Norway, you loose … 😉

Deciding it for yourself

If you can’t let the developer decide, who should make the technical decisions in your organisation then? Unless you’re technically skilled, and you happen to know a lot of software development theory yourself, deciding which components to use yourself, is arguably the equivalent of playing Russian roulette with your organisation. Facts are, some 3rd party vendor could probably have waved a beautiful website in front of your face, and you’d happily buy something having zero value, believing in the company’s spiehl about their product’s superiority. Obviously this doesn’t work either.

What you should do, is to align yourself with somebody having the knowledge required, but no incentives in regards to increasing your technical debt. Somebody who have incentives that are aligned with yours – Then you should “outsource” technical decisions to this individual or organisation. This might be a person you employ, for instance a “super duper senior” developer, that has already reached the point, where he have few things left to prove. Or it might be an external consultancy company, that is neutrally assessing components, without any ties to the vendors creating the components they are assessing.

Doing a StackOverflow search, only results in finding whatever tool happens to be most popular at the time you are doing your search, and speaks zero about quality – Since components happen to suffer by “networking effects” – Which implies that adoption speaks nothing about quality, since developers tends to gravitate towards whatever is the most popular component, realizing this will give them a larger chance in the job market to find a better paid and more interesting job later down the road.

You can still have the most intelligent individual making your (technical) decisions, just make sure his or her incentives are aligned towards your first, to avoid experiencing the Cobra effect!

That way the dog wag its tail again, and the inmates are no longer running the asylum

Leaving it for the developer to decide

Most junior and senior developers have one simple incentive; Investing in their own future. The way they tend to do this, is by acquiring more knowledge about potential things they imagine future employers will be interested in. This way the developer makes himself more valuable to any potential future organisation and employer, until he reaches the point that he has made himself indispensable. This creates a problem, which is that the developer’s incentives is in direct competition with his employers incentives. In fact, the incentives are arguably aligned in completely opposite directions.

At the same time, the employer is 100% dependent upon the developer’s opinion and advice, because he is the only one adequately equipped with the knowledge required to make choices of technical nature. This results in a “wag the dog” situation, where the most capable individual to be making a decision, is also the least likely individual to be making the correct decision.

For instance, if you ask an average developer how he feels about some component that solves some specific task, he might find the challenge of creating a similar component more intellectually challenging than simply reusing something existing. This might result in that the developer will be looking for flaws in the component his employer asks him to evaluate, in an effort to discredit the component, trying to convince his employer that he would be much better off letting the developer implement a similar component for himself. This would be in alignment with the developer’s incentives, which is to make himself more valuable.

The expression “wag the dog” implies that the tail wags the dog, instead of having the dog wag its tail. Similar expressions have been made that are of more explicit character, such as “the inmates are running the asylum”. Regardless of how you look at it, if you let the developer alone to mind his own business, he’ll probably do what’s in his own best interest, which is to accumulate more technical debt on behalf of his employer, happily coding away, one line of code at the time – Until the cognitive overload of the organisation as a whole, is so large the organisation can no longer sustain itself.

But why should the developer care? He already have 20 new job offers at LinkedIn, which he now is far more likely to be able to fill, due to that he’s learned all those new and shiny things, while breaking the back of his current employer.

Congratulations, you’ve now entered the “wag the dog” world, happily allowing your “inmates to run your asylum” – You’re no longer in charge of your own organisation, because you allowed your “most competent individual” to make your decisions

This will probably come as a surprise to you, but allowing your most intelligent resource to make the most important and hardest technical decisions, will only result in more intelligent objections against using the most intelligent solutions.