Glorf.it

Glorf IT

Bedenkliches aus dem IT-Alltag

17. Juli 2006 um 18:32

Spielräume von Tom DeMarco

'Spielräume' von Tom DeMarcoDas Buch "Spielräume" von Tom DeMarco ist zu einem meiner absoluten Lieblingsbüchern aufgestiegen. Wenn man die anderen Bücher von Tom gelesen hat, dann konnte man viel wiederfinden. Ich habe den Eindruck, dass er aus allen seinen Büchern die Essenzen rausgezogen hat und über die heutzutage fehlenden Spielräume verbunden hat.
Er geht grundsätzlich davon aus, dass heute die Flexibilität einer der entscheidenden Kriterien für den Erfolg von IT-Firmen ist. Indem das Management der meisten Firmen alle "Prozesse" durch Standardisierung besenders effizient machte, so schreibt er, wurden die Spielräume abgebaut. Deswegen laufen viele Firmen so effzient. Aber dadurch ging auch die Manövrierfähigkeit verloren, denn um etwas anders (und vielleicht später mal "besser") zu machen, braucht man Freiräume.

Wenn er beschreibt, wie man Wissensarbeitern (z.B. Software-Entwicklern, wie meiner einer) darin unterstützt besonders produktiv zu arbeiten, dann fühle ich mich verstanden. Er spricht mir aus der Seele. Dann frage ich mich immer, ob seine Bücher sowieso nur kleine Lichter (wie ich) lesen oder ob das auch von den "hohen Tieren" gelesen wird? 😉

Genau auf diesen Punkt geht er übrigens auch ein…

Mein Tipp: Das Lesen lohnt sich für jeden der "Wissenarbeiter" oder Chef(fin) von Wissensarbeitern ist.

17. Juli 2006 um 18:24

Bismarckgrotte

Bismarckgrotte 2000 - Klick mich, dann werde ich groß...Die Bismarckgrotte war meine "erste" Höhle, deswegen habe ich irgendwie eine besondere Beziehung zu ihr…
2000 überredete unser Kollege Robert uns als "Gruppenevent" in die Höhle zu gehen. Dafür bin ich ihm noch heute dankbar. Anbei das Gruppenbild von damals. Wir arbeiten immer noch eng zusammen (nur unsere Dame hat sich versetzen lassen) und wühlen uns täglich in die Tiefen von Netz- oder SQL-Problemen…

Die Parallelen beim Erforschen der Netz- und SQL-Probleme zum "richtigen" Höhlenforschen sind frappierend:

  • Ohne entsprechende Ausrüstung ist man aufgeschmissen.
  • Die schwierigen Passagen sollte man nie alleine versuchen, sondern im richtigen Moment die Hilfe anderer in Anspruch nehmen.
  • Wenn man Pech hat, dann muss man auf dem Bauch durch Schlamm und Matsch robben… 😉

Hier wieder ein paar Links:

Als krönender Abschluss der Bericht Bayerns zum Abkommen zur Erhaltung der Fledermäuse in Europa. Darin steht, dass die Bismarckgrotte 2005 etwa 450 Fledermäusen einen Winterschlafplatz bot. Wo sind die im Sommer? Dort sah ich erst eine einzige (und das war auch noch im Mai)…

Update: Siehe auch Links zur Schönsteinhöhle und zum Alfelder Windloch.

17. Juli 2006 um 18:16

Median am SQL Server 2005

Ausgehend von dem Posting letzte Woche möchte eine Lösung für den Median am SQL Server 2005 vorstellen, die wegen der neuen TSQL-Features um einiges performanter ist, als die "alte" Lösung:

Zum Vergleich hier noch mal die "beste" Lösung am SQL Server 2000:

select cast(
(select max(Quantity)
from ( SELECT TOP 50 percent Quantity
FROM #bla
order by Quantity asc) as d)
+(select min(Quantity)
from ( SELECT TOP 50 percent Quantity
FROM #bla
order by Quantity desc) as d)
as numeric(12,2))/2 as "richtiger Median bei ganzen Zahlen"

Diese Lösung am SQL Server 2005 ist etwa um Faktor 4 schneller. Sie basiert auf dem Ansatz von Itzik Ben-Gan, den ich jetzt entdeckt habe: "Calculating the Median Gets Simpler in SQL Server 2005" by Itzik Ben-Gan. (Ein wenig bin ich stolz, dass er für den 2000er die gleiche Lösung vorschlägt wie ich.. 😉 )

In einer Common-Table-Expression wird die komplette Liste durchnumeriert und gezählt. Auf dem Ergebnis werden dann alle bis auf der bzw. die beiden mittleren Datensätze rausgefiltert (WHERE). Dann muss nur noch der Durchschnitt auf dem Rest berechnet werden:

WITH blaRN AS
(
SELECT Quantity,
ROW_NUMBER() OVER(ORDER BY Quantity) AS RowNum,
(select COUNT(*) from #bla) AS Cnt
FROM #bla
)
SELECT avg(Quantity) as Median
FROM blaRN
WHERE RowNum IN((Cnt + 1) / 2, (Cnt + 2) / 2)

Die nächste Lösung für den SQL 2005 basiert auf der Losung von Jörg Neumann, liefert aber in allen Fällen ein korrektes Ergebnis.

Hier passiert im Prinzip das gleiche wie oben. Allerdings wird hier in einer Derived-Table durchgezählt. In der äußeren Query werden dann alle bis auf den bzw. die beiden mittleren Datensätze gefiltert. Dann muss nur noch deren Durchschnittswert berechnet werden:

SELECT avg(Quantity) as Median
FROM
(
SELECT ROW_NUMBER() OVER
(
ORDER BY Quantity DESC
) AS Rank,
Quantity
FROM #bla
) AS sub
WHERE (SELECT COUNT(*) FROM #bla) / 2 in (rank, rank-1)

Der Zugriffplan der unteren Lösung ist leicht komplizierter, aber das macht bei meinen paar Datensätzen keinen Unterschied aus…

Einige sehr interessante Ansätze stehen übrigens auch bei Dan Sullivan.

Anbei noch der Code, um die Beispieltabelle zu füllen:

if object_id(N'tempdb..#bla') is not null drop table #bla
create table #bla (quantity numeric(12,2))
create clustered index i1 on #bla(quantity)

insert into #bla(quantity) values (1)
insert into #bla(quantity) values (2)
insert into #bla(quantity) values (3)
insert into #bla(quantity) values (4)
insert into #bla(quantity) values (5)
insert into #bla(quantity) values (105)

|