Was ist Objektorientierung?

written by Martin Häcker on

Es heißt ja, das man etwas erst wirklich verstanden hat, wenn man es einem anderen Menschen beigebracht hat.

Nun, mir stellt sich mal wieder die Frage, im Rahmen des Javakurses der Freitagsrunde an der TU-Berlin:

Wie erklärt man Objektorientierung wirklich gut?

Verschiedene Kräfte zerren da an mir:

  • Der Vortrag muss in eine Stunde passen
  • Die Sprache anhand der es erklärt werden muss ist Java
  • Die Studenten haben noch nie eine Programmiersprache gesehen
    • oder vorher eine Funktionale Sprache gelernt, die sie nicht verstanden haben

Was mir am meisten am Herzen liegt sagt Kent Beck in Smalltalk best Practice Patterns einfach wunderschön:

Objects model the world through behavior and state. Behavior is the dynamic, active, computational part of the model. State is what is left after behavior is done, how the model is represented before, after, and during a computation.

Of the two, behavior is the more important to get right. The primacy of behavior is one of the odd truths of objects, odd because it flies in the face of so much accumulated experience. Back in the bad old days you wanted to get the representation right as quickly as possible, because every change to the representation bred changes in many different computations.

Objects (done right) change all that. No longer is your system a slave of its representation. Because objects can hide their representation behind a wall of messages, you are free to change representation and only affect one object.

Nur leider können die Studenten mit dem Vergleich in die alten Tage nix anfangen, denn sie haben ja gerade keine Erfahrung warum die alten Tage schlecht waren.

Immerhin der erste Satz ist brauchbar - und ich werde ihn tunlichst einbringen. Damit ist das Problem doch schon mal zumindest kleiner geworden.

Denkfutter bis zum nächsten mal...

Warum entwickeln immer noch so viele Leute ohne UnitTests?

written by Martin Häcker on

Weiß ich nicht, aber ich weiß, was für Folgen es hat.

Wenn man ohne Tests entwickelt, dann hat man beim Schreiben von z.B. einer Klasse immer den vollen Zugriff auf das gesamte System - und es ist ständig verlockend, nur eben dieses andere Subsystem aufzurufen oder es in die klasse als Instanzvariable einzubinden. Da man kein Korrektiv hat, sind die Folgen dieser Handlungen fast unsichtbar. Die Abhängigkeiten im System nehmen immer weiter zu - und die Architetkur immer weiter ab. :/

Als Testgetriebener Entwickler muss man sich, um den Code in einer Testsuite überhaupt laufen lassen zu können maximal vom Rest des Systems abkapseln. Das bedeutet das man sich bei jeder Abhängigkeit die man dazu nimmt genau überlegt, ob man sie wirklich braucht, ob man sie erreichen kann, indem man einen Parameter übergibt, oder indem man ein Protokoll einführt das die Kommunikation dieser zweier Systembestandteile klärt. Immer macht man sich über die Grenzen der Komponente Gedanken und wie die Kommunikation darüber hinaus abläuft.

Man macht eben nicht einfach nur einen Konstruktorparameter über den dann als globale Variable alles zugänglich ist - den man im Test aber niemals instanziiert bekommt.

Diese Tatsache macht für mich einen der größten Unterschiede zwischen Testgetrieben entwickeltem Code und sonstigem Code aus.

Es ist unglaublich schwierig (auf anhieb) Code zu schreiben der Wiederbenutzbar ist und wenig Abhängigkeiten besitzt - wenn man Code testgetrieben entwickelt bekommt man aber unheimlich viel davon umsonst.

Alleine deswegen darf es heute eigentlich keine Ausrede mehr Geben ohne Tests zu entwickeln.

Die Provider sollen gefälligst P2P verhindern!

written by Martin Häcker on

Fodert Dieter Gorny, Cheff des Bundesverbands der Musikindustrie. Klar.

Spannend finde ich aber das er vorgibt, aus der letztlich erschienen Brennerstudie wäre ersichtlich das sich illegale Downloads um die Hälfte reduziert haben.

Nämlich von 600 Millionen auf 300 Millionen.

Da würde ich doch schon mal gerne die Studie sehen, Herr Bundesverband. Und was da genau gefragt wurde. "Wie viele illegale Downloads haben sie im letzten Jahr gemacht?" oder "Sind sie sich im klaren darüber das das herunterladen von Musik aus dem Internet illegal ist?" und direkt danach "Wie viele Musikstücke haben sie im letzten Jahr heruntergeladen?"

Vielleicht taugt die Studie ja auch und die Leute sind dazu übergegangen Fernsehserien etc. herunter zu laden. Jedenfalls weiß ich nichts darüber das sich die verbrauchte Bandbreite oder der Anteil der P2P-Dienste an der Gesamtbandbreite irgendwie verringert hätte.

Wirklich schade, das man in der Politik nicht seine Quellen offen legen muss, wie in der Forschung. :-/

Transparenz ist doch was feines.

UnitTests auf ein TracPlugin...

written by Martin Häcker on

... sind eine schöne Sache. Wenn man sie denn hinkriegt.

Da wäre zuerst der einfache Fall: Was macht man um eine Wiki-Seite zu erzeugen und zu laden?

Well, hier ist wie es geht:

#!/usr/bin/env python

import unittest

from trac.wiki.model import WikiPage
from trac.test import EnvironmentStub

class PluginTests(unittest.TestCase):

    def test_can_save_and_load_wiki_page(self):
        env = EnvironmentStub()
        page = WikiPage(env, "Foo", None)
        page.text = "barfoo"
        page.save("fnord", "bar", "localhost")

        self.assertEquals("barfoo", WikiPage(env, "Foo", None).text)

Soweit nicht soo schwer. Vor allem sehr schick, das das EnvironmentStub() einem die ganze Arbeit abnimmt um das Trac-Environment UnitTest fähig zu machen. Ein Call und alles ist da - inklusive einer in-memory Sqlite Datenbank.

Nice.

Der eigentliche Hammer ist dann aber, wenn man ein Plugin bauen will das von anderen Plugins abhängt. Das ist nämlich deutlich komplizierter.

Da ergibt sich nämlich das Problem, das man plötzlich das Component-System von Trac verstehen muss, damit man überhaupt auf die Klassen und ExtensionPoints eines anderen Plugins aufbauen kann.

Für uns um Beispiel das TracTags-Plugin. Dieser Blog basiert auf diesen Tags. Blog-Posts werden durch einen speziellen Tag ("blog") zu einem Blog-Post, Kategorien sind nur Tags und überhaupt funktioniert alles nur über Tags. Tags sind cool.

Aber, man muss das Plugin erst einmal schwer zur Zusammenarbeit überreden - denn, es benötigt ein Datenbankupgrade damit es überhaupt funktioniert.

Und überhaupt ist die Datenbank am Anfang total leer. :/

Um es gleich zu verraten: Die Lösung lag darin, das man dem Environment einerseits sagen muss, das man gerne Standard-Daten hätte und andererseits, welche Plugins es alles aktivieren soll. Nicht schwer. Nur nicht offensichtlich. :(

#!/usr/bin/env python

import unittest

from trac.wiki.model import WikiPage
from trac.test import Mock, EnvironmentStub, MockPerm

from tractags.api import TagSystem

from tractags.model import TagModelProvider

class PostFinderTest(unittest.TestCase):

    def setUp(self):
        self.env = EnvironmentStub(default_data=True, enable=["tractags.*", 'trac.*'])
        self.env.upgrade()        
        self.env.db.commit()


    def test_can_save_and_load_wiki_page(self):
        page = WikiPage(self.env, "Foo", None)
        page.text = "barfoo"
        page.save("fnord", "bar", "localhost")

        self.assertEquals("barfoo", WikiPage(self.env, "Foo", None).text)


    def test_can_add_tags_and_retrieve_tagged_pages(self):
        from trac.web.href import Href
        page = WikiPage(self.env, "Foo", None)
        page.text = "barfoo"
        tag_system = TagSystem(self.env)
        req = Mock(perm=MockPerm(), args={}, href=Href('/'))
        tag_system.add_tags(req, page.resource, ["blog"])
        page.save("fnord", "bar", "localhost")

        self.assertEquals("barfoo", WikiPage(self.env, "Foo", None).text)

        blog_resources = [i for i in tag_system.query(req, "blog")]
        self.assertEquals(1, len(blog_resources))

Mei war das eine Arbeit die ganzen Objekte zusammen zu suchen die man für test_can_add_tags_and_retrieve_tagged_pages() benötigt.

Well, ein start ist gemacht, aus dem wir jetzt einen Page-Loader refactor-n (-ieren?) werden.

Yay!

Heute blog ich nicht

written by Martin Häcker on

Dafür bin ich nämlich viel zu betrunken.

Schließlich hat die Friedrich Ebert Stiftung heute den Wein bezahlt, den ich abgegriffen habe, während ich meine Freundin von einer Veranstaltung dort abgeholt habe.

Das Essen war auch nicht soo toll.

Naja, immerhin der Rotwein.

Ach ja, die Veranstaltung hieß: "Außen vor oder mittendrin? Gesellschaftliche Partizipation und Anerkennung erwerbsloser Menschen". An sich spannend, aber die Teilnehmer haben eigentlich alle nur immer die gleichen bekannten Stereotypen von sich gegeben. Wirklich gut fand ich (neben meinem Vater :) dann vor allem Frauke Hehl die mal wirklich gesagt hat was sache ist: Das alle Arbeit haben ist einfach inzwischen eine Illusion der wir uns nicht mehr hingeben dürfen.

Recht hat sie.

So, und jetzt gute Nacht.

In der Piratenpartei…

written by Martin Häcker on

Das Spannendste an der Piratenpartei sind die, die dabei mitmachen.

Zum Beispiel RKA. Mir ist ein Rätsel, wie er die ganzen Dinge, die er tut, in seine Zeit einsortiert.

  • Bei der Piratenpartei ist er aktiv - bald sogar im Vorstand.
  • Beim AK-Vorrat ist er aktiv - er hat dort z.B. die Abgabe des Schriftstücks (120 Ordner) für die Klage gegen die Vorratsdatenspeicherung mit vorbereitet
  • Privat gründet er noch diverse Firmen mit
  • Studiert nebenbei noch Wirtschaftsrecht
  • Weiß von allen Dingen, wo man sie bekommen kann
  • Hat einen grandiosen Überblick, wo im Internet welche Startups gerade was machen

Einfach beeindruckend.

Was ist das eigentlich,

written by Martin Häcker on

dass Betreiber von Geschäften so überwachungsgeil macht?

Zum Beispiel dieser Eigentümer einer Diskothek. Der erstellt über jeden seiner Besucher ein komplettes Persönlichkeitsprofil, inclusive wann sie bei welcher Bedienung wie viel von welchen Getränken gekauft haben. Und natürlich von wann bis wann sie anwesend waren, woher sie kommen, welche Telefonnummer sie haben, etc.

Das Geilste: die Überwachten Club-Gänger werden dargestellt, als fänden sie das ganz toll. Schließlich müssen sie als Mitglied keinen Eintritt bezahlen und erhalten Zutritt zum Buffet.

Diese Daten werden ewig aufgezeichnet - die Bilder der Überwachungskamera 'nur' mindestens ein halbes Jahr auf dem Privatrechner des Eigentümers.

"Die wollen das doch genau so!" hört man den Betreiber quasi schreien.

Und was wenn er Windows benutzt und jemand bei ihm in das Rechnernetzwerk einbricht und die Daten alle stiehlt?

p.s.: Haben wir da jetzt nicht ein Grundrecht auf Datenintegrität?

Connect the Dots

written by Martin Häcker on

"You can only connect the dots looking backwards, never looking forward." -- Steve Jobs

Sagt er hier.

Geiler Vortrag.

Piraten aller Länder, vereinigt euch!

written by Martin Häcker on

Über meinem Schreibtisch hängt schon seit zwei Jahren ein Zettel. Darauf habe ich damals geschrieben:

Eine Revolution: Computer Zwei Ideen: Grundeinkommen, Zinskatastrophe

Das würde ich heute anders formulieren: Zwei Revolutionen, eine Idee

  1. Die Computerrevolution
  2. Die Arbeitsrevolution

Die zweite ist sichtbarer und erzeugt (scheinbar) mehr Probleme, da sie immer mehr Menschen arbeitslos macht. Dabei ist sie mit er der ersten Verknüpft. Immer mehr Tätigkeiten können durch Computer- und Maschineneinsatz dem Menschen abgenommen werden und uns allen steht damit mehr Freizeit zur Verfügung (ok, abgesehen von den Informatikern, die das alles am Laufen halten müssen). Das bedeutet letztlich, das mit fortschreitender Technik immer weniger Arbeit notwendig und immer mehr Arbeit freiwillig wird. Und das muss sich in unserer Gesellschaftsordnung früher oder später wieder spiegeln. Durchdenkt man das, wird natürlich auch schnell klar, das Geld als Druckmittel um Arbeit zu erzwingen damit ein reichlich merkwürdiges Konzept ist, denn tatsächlich ist die Arbeit ja unsinnig oder zumindest unnötig. Lösungsansätze: Bedingungsloses Grundeinkommen (Wikipedia), Netzwerk Grundeinkommen, Deutsche Abteilung?

Die erste Revolution ist viel unsichtbarer - Computer durchdringen immer mehr Gebiete unseres Altags und algorithmisieren sie. Das bedeutet, das implizite Regelungen damit Explizit werden und wir uns plötzlich Gedanken über diese Details machen müssen.

Zum Beispiel: Heute sind Verkehrsregeln eine Konvention an die man sich hält. Sollten Autos irgendwann mit Autopiloten fahren, kann man nicht mehr einen Schwerverletzten auch über Rote Ampeln ins Krankenhaus fahren - ein Automat würde die Verkehrsregeln stur einhalten. Oder Verfahrensregeln in Verwaltungen. Wo heute etwas Charme vielleicht genügt unsinnige Regeln aufzuweichen, kann man sich einem Computer gegenüber noch so anstrengen. Man muss den Regeln doch genügen.

Das sind aber alles noch harmlose Beispiele. Wo früher die Komplettüberwachung alle Kommunikation völlig ausgeschlossen war, ist es heute Routine das alle Verkehrsdaten aufgezeichnet werden.

Daher ist es notwendig, das diejenigen die diese Probleme verstehen (Informatiker?) dieses Wissen und ihre Erfahrung in den politischen Prozess einbringen.

Das darf auf keinen Fall in den Strukturen einer bestehenden Partei versickern und ist auch überhaupt nicht geeignet in die Farbenlehre der bestehenden Parteien eingeordnet zu werden - denn die Probleme haben (erstmal) überhaupt nichts mit den bisherigen politischen Richtungen zu tun.

Ich bin daher der Meinung das die Gründung der Piratenpartei der richtige Schritt war.

Davon abstrahiert ist es aber Wichtig, das jeder der diese Probleme versteht mit seinen Mitteln an ihrer Lösung beteiligt - ich habe dafür mein Engagement im Berliner Landesverbands gewählt und kann es natürlich nur jedem ans Herz legen. :)

Wir treffen uns jeden Mittwoch 18:00 Uhr in der C-Base. (Rungestraße 20, 2. HH - 10179 Berlin)

Zur Zinskatastrophe sage ich später mehr.

Darf's ein neuer Lampenschirm sein?

written by Martin Häcker on

Ob Ikea wohl bald pleite geht?

So jedenfalls malt Freitag die Zukunft in der jeder Zuhause einen 3D-Drucker stehen hat, der fast beliebige Altagsgegenstände (inklusive Elektronik) herstellen kann.

Klingt gut nicht?

Naja, bis man sich klar wird, das die angestrebte Selbstreproduktion dieser Geräte natürlich bedeutet das sie ihre Einzelteile selbst herstellen können. Zusammenschrauben muss sie immer noch der Mensch der ehrfürchtig vor dem Gerät sitzt.

Spannend finde ich das aber schon. Im Dunstkreis des CCC ist schon länger davon zu hören, das die (wieder) immer mehr zunehmenden Hardware-Hacker jetzt auch Rapid-Prototyping Maschinen selber bauen können. Und das für so etwa 200-3000 € - je nach Anspruch und Bastelkenntnis.

An den Durchbruch der Produktionsmittel Zuhause glaub ich zwar noch nicht - aber wenn man doch mal mit Aliens kommunizieren will, dann ist heute immer noch die Idee, Selbstreproduzierende Satelliten loszuschicken die beste. Die könnten dann nämlich mit möglichst viel lokalem Speicher die Kunde über unsere Kultur quasi in einem gigantischen "Turnschuhnetz" in fremde Sternensysteme bringen - und umgekehrt.

Da wäre eine erste sich selbst reproduzierende Maschine natürlich schon ein ganz guter Start...

Spannende Wikipedia-Artikel über die ich beim Schreiben gestolpert bin: Alternative Biochemien (engl), Exopolitik (engl), Pansperma (engl)