generateRandomId()

Wie erzeugt man in einem kompjuterprogramm eine „zufällige“ ID? Man könnte ja einfach einen kryptografischen zufallsgenerator nehmen, aber das ist doch immer ein gewisser aufwand. Wenn der anspruch etwas kleiner ist, könnte man auch einen ganz gewöhnlichen zufallsgenerator verwenden, nachdem man ihn mit der systemzeit initialisiert hat, so ein MT 19937 ist im zweifelsfall auch schnell selbst gekohdet. Das hier ist jedenfalls keine so gute vorgehensweise, die werte sind doch etwas vorhersagbar:

export function generateRandomId(): string {
    counter++;
    return 'id' + counter;
}

Wenn ich so etwas sehe, frage ich mich ja immer, wieviel derartiger schrottkohd in großen programmen und vor allem in schnell gemachten, billigen smartdingern drinstecken wird. 😦

Programmierung aus der hölle für die hölle

Well those are subversions link to all the functions that make up the class! […] Whenever something makes a function call on a Customer object, JDSL uses the list of function revisions to check out all the actual functions until it finds a match! Understand?

[…] thanks to the complexity of JDSL it took days to do coding work that should only take minutes

[…] „You can’t use comments in JDSL!“ Tom shouted. „THAT’S WHAT BROKE IT!!“

Weia!

Kwalitätssoftwäjhr des tages

Vor vielen jahren habe ich mal in einem C++-projekt eine der schlimmsten zeilen kohd gesehen, die ich je gesehen habe (nicht-programmierern ist das nur schwierig zu erklären):

#define private public

Nun, wenn man so etwas in PHP machen will, hat man zwar keinen präprozessor zur verfügung, aber das heißt noch lange nicht, dass man das nicht doch irgendwie machen kann.

WTF des tages

Wenn man als programmierer vor der aufgabe steht, eine zahl runden zu müssen, und man hat aus irgendeinem grund keine funkzjon in seiner bibliotek, ist das ja schnell gekohdet. Zum beispiel in C so¹:

double 
round (double x, unsigned precision)
{
    int sign = x < 0 ? -1 : 1;
    double factor = pow (10, precision);
  
    x = fabs (x);
    return sign * (floor (factor * x + .5)) / factor;
}

Zugegeben, diese in einer einzigen minute eben gerade von mir abgesonderte funkzjon hat schwächen. Zum beispiel fehlt jede fehlerbehandlung, und durch die benutzung der allgemeinen pow ()-funkzjon zum potenzieren ist sie auch nicht gerade besonders performant. Aber sie geht erstmal so, und sollte es später nötig sein, kann man das performanzproblem schon angehen.

Zumal diese grandiose lösung eines unbekannten delphi-programmierers wohl auch nicht gerade durch performanz glänzen wird:mrgreen:

¹Ich habe zwar mal in delphi geproggt, weil es sehr einfach war, in delphi eine windohs-DLL zu bauen, aber ich könnte heute nicht mehr flüssig in diesem objektorientierten pascal tippen, deshalb nehme ich C. Die delphi-versjon wäre nicht wesentlich länger.

Wie wir früher mit arrays proggten…

Früher, als man seine softwäjhr noch so geschrieben hat, dass sie den rechner nicht in die knie zwang und so, dass sie nach möglichkeit einfach gut lief, hatten wir natürlich auch schon das problem, dass die größe eines array manchmal erst zur laufzeit feststand. Tja, dann haben wir halt mit malloc() eine ausreichend erscheinende menge speicher alloziert, uns gemerkt, wieviel das ist und wenn wir beim einfügen an die grenzen kamen, haben wir den speicherbereich mit realloc() vergrößert — in der regel durch schlichte verdopplung¹ der allokazjon. Und wenn man sortiert einfügen wollte, einfach mit binärer suche den ort zum einfügen des neuen elementes gefunden und mit memmove() platz für das neue element geschaffen, dass wir dann an die richtige stelle brachten. Nicht, dass so etwas spaß macht, aber es funkzjoniert und ist halbwegs performant.

Tja, das waren die alten zeiten, in denen man altmodische sprachen wie C verwendet hat, die einem nicht alles am kompjuter abstrahierten. Heute hingegen, heute ist alles viel viel besser. Heute fordert man einfach für jedes eingefügte element einen neuen speicherbereich an, der für ein element mehr platz bietet, kopiert den alten speicherbereich in den neuen und fügt das neue element an, um zum einfügen an die richtige stelle eine allgemeine biblioteks-sortierfunktion (meistens als mergesort oder quicksort implementiert) aufzurufen. Am besten in einer inneren for(;;)-schleife, also für eine vorab bekannte anzahl von fällen nacheinander. Und damit man nicht sofort merkt, wie hirnrissig das ist, notiert sich das ganze in schönster C++-syntax. So wird aus ganz gewöhnlicher datenverarbeitung eine implementazjon, die auch auf zeitgemäßer hardwäjhr ganz schön lahmarschig läuft. Und es gibt keine elektronen im kompjuter, die sich dabei langweilen.

Ich führe ja einen großteil der unbefriedigenden performanz „moderner“ anwendungen auf solche idjotie zurück…

¹Technischer hinweis: ursprüngliche allokazjon ist gern eine zweierpotenz minus eins, und zum vergrößern wird dieser wert verdoppelt und eins addiert, so dass wieder eine zweierpotenz minus eins rauskommt, also 255, 511, 1023, 2047, etc. Natürlich kann man das oft — je nach konkreter anwendung — ein bisschen intelligenter machen, aber frühzeitige optimierung ist eine der häufigsten und garstigsten fehlerkwellen, und diese schlichte implementazjon ist ganz brauchbar. Ziel des vorgehens ist es, die relativ aufwändige und langsame anforderung von speicher selten zu machen.