Call Graph Acyclicity


In technical design of software systems as conventionally practiced, call graphs often contain cycles. We show that cyclic call graphs are highly problematic for a number of reasons, the most important being that they require careful handling on a case-by-case basis by custom-written code, thus preventing the standardization, and therefore the automation, of system assembly. We discuss refactoring strategies for systematically eliminating call cycles, including a universally applicable technique for trivially eliminating a certain common type of call cycle. We conclude that since call cycles can be avoided or eliminated, they can be comprehensively disallowed, thus paving the way for the standardization and automation of system assembly.


Towards Authoritative Technical Software Design


In this paper we examine the long-standing need within the Software Engineering Discipline for technical design documents that are authoritative. A design document is authoritative if there exist technical means of materializing it as a running software system, thus guaranteeing that the end result is indeed precisely as described by the design. We notice the scarcity and inadequacy of existing solutions, we look into the difficulties involved in the creation of such documents, and we conclude with some realizations on what it would take to come up with a solution that works.


Converting MSBuild project files from legacy-style to SDK-style

I recently did this at work, and I decided to document the process here in the form of a how-to guide. Please note that I am not an expert, I am learning as I go along, so there may be mistakes.

Sdk-style project files have existed since net5. The kind of project files we were using before that can now be called legacy-style project files.

  • Legacy-style project files begin with <Project ToolsVersion="...
  • Sdk-style project files begin with <Project Sdk="Microsoft.NET.Sdk">.

Sdk-style project files are necessary if you want to:

  • Start using the `dotnet` command-line utility and all the functionality that it provides.
  • Eventually migrate to a modern version of dotnet.


On the "Dotfuscator" tool by PreEmptive Solutions

I am giving this tool a try at work, and I am encountering a great many problems with it. I decided to publicly document my findings.


Migrating a project from DotNet Framework 4.7.2 to DotNet 7

I recently did this at work, and I decided to document the process here in the form of a how-to guide. Please note that I am not an expert, I am learning as I go along, so there may be mistakes.


[SOLVED] Maven deploy fails with status 422 unprocessable entity

It has been more than a year since I created this question on GitHub Community; a couple of days after that I found the solution by myself, so I answered my own question, and to this date comments keep being added by people who were helped by my post.  

When I look at it today, I notice that my answer has this particular style, this grumpy indignation which has become so characteristic of me, after a lifetime of battling with lame software, and even worse, with lame error messages. 

I thought I should share this on my blog for posterity.

Here is the link:


The Trouble with XAML Hot Reload in WPF

The XAML Hot Reload feature of WPF is extremely useful because GUI work often involves tweaking visual aspects of an application, so being able to modify XAML, save it, and immediately see the changes on the screen saves a huge amount of time as opposed to having to terminate the application, modify the code, re-compile, re-run, and go clickety-clickety-click to navigate to the same page and finally see your changes.

Unfortunately, as a WPF project grows, the XAML Hot Reload feature inevitably one day stops working: You modify your XAML, you save the XAML file, and yet nothing changes on the screen. The message "No changes were found" appears in the Hot Reload tab of the Visual Studio Output Window, but it is a damned lie, because you just made changes. This can really be a problem.

When you find yourself in this extremely unpleasant situation, here is a list of things to try:


Program Code is Uncountable

There are some words in English that are uncountable. For example: "fish", "sheep", "bread", etc. When we want to speak of many of those things, we do not say "fishes", "sheeps", or "breads"; we still use the singular form: "I caught lots of fish", "Please count the sheep", "Do not eat too much bread", etc.


Hyrum's Law

With a sufficient number of users of an API,
it does not matter what you promise in the contract:
all observable behaviors of your system
will be depended on by somebody.

Hyrum's Law
(From https://www.hyrumslaw.com/)


Notable severely down-voted answers of mine on Stack Exchange

Among the answers that I have given to thousands of different questions on stackoverflow.com and softwareengineering.stackexchange.com, some have been vehemently down-voted.

Sometimes I make mistakes; when that is the case, I delete my answer; however, in other cases, the down-votes represent opinon which is in disagreement with my opinion, and in those cases I let my down-voted answers be, since I stand by my own convictions.

I suppose that this is the price you has to pay for: a) having your own opinions; and b) daring to voice them: there will always be some folks who will take offense.

Here is a list of my severely down-voted answers, so that you too can take offense and down-vote them even further:

Stack Overflow: api design - Which HTTP code is most suitable for when an endpoint is "full"?

Software Engineering: api design - Should a REST API return a 500 Internal Server Error to indicate that a query references an object that does not exist?

Software Engineering: grammar - Does it make sense to use "ys" instead of "ies" in identifiers to ease find-and-replace functionality?

Software Engineering: java - Is it okay to have objects that cast themselves, even if it pollutes the API of their subclasses?


Trees of Eternity

This band has been haunting me for the past days. I feel compelled to write about it. This post will be completely different from the kind of posts you normally see on this blog.

While going through some random playlist on YouTube I stumbled upon this band that I immediately took a liking to, which is something that does not happen often. When I tried to find out a bit more information about them, what I discovered wrecked me.


[SOLVED] Windows: Sound becomes distorted after 1 second of playback

So today I started encountering a very weird audio issue: When I play music, it sounds normal in the beginning, but then after about a second the sound gets distorted, as if it is muffled, or as if it is undergoing severe lossy compression.  If I stop and resume the music, it goes through the same.

Normally I would know what to do in this situation, but as the years pass Microsoft keeps changing Windows, in the direction of making them dumber and dumber, so in Windows 10 I cannot find the old sound options dialog that I used to use to fix this problem.

Looking around the interwebz for a solution was not easy, so I decided to document the solution that I found.  If you are a power user, you can skim through the text and only look at the words in bold-italics.

  1. Type Win+R and type mmsys.cpl. This will bring up the good old sound options, which Microsoft recently made inaccessible by any means other than this magical incantation, because obviously, nobody should ever want to fix any sound problems, because obviously, Windows has no sound problems.
  2. In the Playback tab, locate your Speakers. If you are playing music at that moment, they are easy to locate from the live volume meter right next to them. 
  3. Select Properties on your speakers.  (Not Configure, but Properties.)  This should open a Speakers Properties dialog.
  4. On the Speaker Properties dialog, select the Advanced tab.
  5. Near the bottom of the Advanced tab there is an Enable Fucked Up Sound checkbox, which is actually labelled Enable Enhancements.  (Euphemism has always been Microsoft's forte.)
  6. Uncheck that checkbox; you are done.


I probably started experiencing this problem right after pairing a new bluetooth sound device. Apparently when Windows detects a new sound device it sets some things up for it, and while doing that it entirely arbitrarily also goes and resets some settings for existing devices, e.g. it enables this "Enhancements" setting for my existing speakers.


A few good reads from Simplethread

I found them at a place called Simplethread while randomly browsing. 

I thought I'd post links here for posterity.

Taming Names in Software Development by Joseph Glass (2022)

Agile at 20: The Failed Rebellion by Al Tenhundfeld (2021)

20 Things I’ve Learned in my 20 Years as a Software Engineer by Justin Etheredge (2021)


On Recruiters

Image from Freepik

Note: This post is a draft; work-in-progress.

If you have ever been in the job market looking for the next move on your career, you cannot have failed to notice that job advertisements on various job boards fall in two distinctly different categories: those that disclose the identity of the employer, and those that do not.

As a rule, a job advertisement will not fail to state exactly who the employer is when the employer is doing their own hiring, either direcrly or via an exclusive partnership with a hiring agency. On the other hand, when the job advertisement keeps the identity of the employer a secret, referring to them as "my client", or utilizing subterfuges such as "a well-established company", "a leader in the field", etc., this means that it has been posted by an independently acting recruiter (henceforth simply "recruiter") who does not have an exclusive agreement with the employer. (And the term "my client" is almost always a lie.)

The reason for the secrecy is not understood by most candidates; a common misconception is that some employers wish to remain unidentified when hiring. This is true in such an exceedingly small percentage of cases that it is almost mythological. The true reasons for secrecy in job advertisement are the following:
  • To prevent candidates from bypassing the recruiter and directly contacting the employer.
  • To prevent other recruiters from finding out about the job and creating their own competing job advertisements for it.
  • To post advertisements about jobs that do not actually exist. (You might say, huh? -- I will explain, keep reading.)


Debating with other Software Engineers

Stackoverflow and the whole Stackexchange network is good for asking very narrowly-scoped questions that can receive objective and preferably authoritative answers that cite documentation or definitions. Any kind of question which is subject of opinion, or liable to elicit debate, is off-topic there. This means that stackoverflow is only good for asking strictly technical questions, and there is an upper limit on how valuable this can be. Sure it can be very helpful when you are trying to solve a specific technical problem, but in the grand scheme of things, it is irrelevant; from a philosophical point of view, it is trivial.

I have been looking for ways to discuss with other software engineers (preferably experts) issues that are related to software engineering but are in fact very much subject of opinion. These are the interesting questions. I do of course already have my own opinions, which tend to either deviate or be diametrically opposite from the prevailing industry trends, so it would be very useful to me to debate these issues with others to see what they have to say. Clearly, either I am wrong, or the entire industry is wrong; wouldn't it be nice if we could debate this and have it settled?

To this effect, I decided to give a few forums a try, to see if it is possible to have debates in any of them. As it turns out, there seem to be very few options available, and things are rather quiet in each one of them; most people seem to be doing nothing but consuming content generated by influencers instead of participating in discussions. In this post I am listing my findings so far. I will be amending it as I gather more information.


Definition: Collaborator

Collaboration, by michael.gr, based on original 'Gear' by Lluisa Iborra (https://thenounproject.com/icon/gear-1031260/) and 'hands making a circle' by Oleksandr Panasovskyi (https://thenounproject.com/icon/hands-making-a-circle-4289633/) from the Noun Project.

I have been coming across the term collaborator in software literature, and I have been using it too in my own writings, but without having seen it defined. I tried searching for its definition, but could not find any. In UML the term collaboration is vaguely described, but not the term collaborator. After asking on Software Engineering Stack Exchange I was pointed to what is in almost all certainty the original definition, but it turns out that it is very old, and slightly problematic, so I thought I should provide a modern definition here, at the very least for use in my own writings.

Here it goes:

A collaborator is a component invoked by another component to do a job.

(And since the context is software, these are, of course, software components.)

Origin of the term


On Mock Objects and Mocking

Mocking by michael.gr, based on 'mock' by 'Iconbox' from  https://thenounproject.com/icon/mock-2657532/


The practice of using Mock Objects in automated software testing is examined from a critical point of view and found to be highly problematic. Opinions of some well known industry speakers are cited. The supposed benefits of Mock Objects are shown to be either no real benefits, or achievable via alternative means.



Collaboration Monitoring

Collaboration Monitoring by michael.gr based on original work 'monitoring' by Arif Arisandi and 'Gears' by Free Fair & Healthy from the Noun Project.

An automated software testing technique is presented which solves the fragile test problem of white-box testing by allowing us to ensure that the component-under-test interacts with its collaborators according to our expectations without having to stipulate our expectations as test code, without having the tests fail each time our expectations change, and without having to go fixing test code each time this happens.