ext3, vfat and git: Not a .git repository

When setting up sys004 (my main productive system), I thought VFAT as filesystem at my main data partition would be a nice idea, because I can use it with Windows too and Linux supports it better than NTFS. However, it was a bad idea. Git refuses to work, whenever it cannot set file permissions (Note: vfat does not support this!) and the HEAD file’s filename is lowercased (Note: vfat lowercases filenames). So I copied all my data, reformatted the partition and got a ext3 filesystem (I think accessing data from Windows is not that important to me). Now git throws the error message:

fatal: Not a git repository (or any of the parent directories): .git

Execute those commands to make git work again. This is zsh-only (because of **/*):

# Get rid of whitespaces in filenames. Damn you, sh.
IFS='
'
# permission problem: Remove executable flag from all files for "all" for the entire new ext3 filesystem
find /media/ex_vfat -type f -print0 | xargs -0 chmod a-x
# lowercase problem: .git/head becomes .git/HEAD again.
for FILE in ./**/*/.git/head; do mv $FILE $(dirname $FILE)'/HEAD'; done;

This is it. Your git-repo should work again now properly. Mine did 🙂

ext3, vfat and git: Not a .git repository

“Why Nerds are unpopular” (Paul Graham)

The best and truest quotes (imho, because I have experienced them myself):

Adults can’t avoid seeing that teenage kids are tormented. So why don’t they do something about it? Because they blame it on puberty.

Because I didn’t fit into this world, I thought that something must be wrong with me. I didn’t realize that the reason we nerds didn’t fit in was that in some ways we were a step ahead. We were already thinking about the kind of things that matter in the real world, instead of spending all our time playing an exacting but mostly pointless game like the others.

Teenagers seem to have respected adults more then, because the adults were the visible experts in the skills they were trying to learn. Now most kids have little idea what their parents do in their distant offices, and see no connection (indeed, there is precious little) between schoolwork and the work they’ll do as adults.

And if teenagers respected adults more, adults also had more use for teenagers. After a couple years’ training, an apprentice could be a real help. Even the newest apprentice could be made to carry messages or sweep the workshop. Now adults have no immediate use for teenagers. They would be in the way in an office. So they drop them off at school on their way to work, much as they might drop the dog off at a kennel if they were going away for the weekend.

In almost any group of people you’ll find hierarchy. When groups of adults form in the real world, it’s generally for some common purpose, and the leaders end up being those who are best at it. The problem with most schools is, they have no purpose. But hierarchy there must be. And so the kids make one out of nothing.

Paul Graham’s “Why Nerds are unpopular
Recommended for all interested people in topics of nerdism and american education. Just a nice Saturday night lecture.

“Why Nerds are unpopular” (Paul Graham)

Notizen zu Extreme Programming (CRE 028)

Als ich CRE 028 zum ersten Mal hörte, war ich ziemlich begeistert vor allem, weil ich akut Softwareentwicklungstipps brauchte. Jetzt hörte ich es zum zweiten Mal und bin noch immer begeistert. Mit Extreme Programming (XP) werde ich mich einmal intensiv beschäftigen (müssen 🙂 ). Agile Softwareentwicklung ftw. Hier habe ich meine Notizen zu dem Thema zusammengefasst. Eventuell ist nicht alles XP-spezifisch, aber der Gastredner Pavel Mayer hat darauf verwiesen.

Basis: Problemen und Ängsten mit Offenheit & Ehrlichkeit begegnen und Unzufriedenheit mit eigenen Softwareentwicklungsstrategien als Motivator zur Veränderung:

Probleme des Entwicklers, Ängste des Kunden:

  • Entwicklung hält sich nicht an den Plan und verfehlt das Ziel
  • Entwicklung hält sich genau an den Plan und verfehlt trotzdem das Ziel
  • Kunde bekommt wenig vom Entwicklungsprozess mit und kann nicht einschätzen, welche Komponenten kostspielig sind
  • Kunde möchte vorab Kostenaufwand wissen
  • Kunde ändert seine Meinung
  • Kunde übergibt die Verantwortung an “fremde Techies”, um größeres Ziel zu erreichen
  • Kunde versteht Produkt und auch Dokumentation nicht
  • Kunde erhält keine Kritik zu Zielen / Ideen und erkennt erst hinterher Fehler, die Entwickler bereits im Entwicklungsprozess erkannten

Probleme des Kunden, Ängste des Entwicklers:

  • Überforderung des Entwicklers
  • Unterforderung des Entwicklers
  • Inkompetenzen / Selbstzweifel des Entwicklers
  • Verwendung von veralterten Herangehensweisen / Methoden / Wissen
  • Übermäßige Verantwortung und zugleich fehlende Autorität (zB Zeit einhalten und zugleich beschränkte Entwicklerzahl)
  • Qualität opfern um Termine einzuhalten
  • Hilflosigkeit / Einsamkeit bei schwierigen Problemen
  • Zeitdruck beim Entwickeln (wenn von Anfang an klar ist, dass die Deadline nicht eingehalten werden kann)

Fakten:

  • Iterativ und kleinteilig arbeiten. Sehr bald funktionierendes System anstreben
  • Funktionierendes System muss ständig verfügbar sein
  • OpenSource-Entwicklung relativiert oft Verhältnis zu “Kunde”
  • Einarbeitungszeit in XP + großes Softwarepaket beträgt etwa 1-2 Monate. Nach 6 Monate vollwertige Mitarbeiter und können bereits neue Mitarbeiter einschulen
  • Einarbeitungszeit in XP nicht groß (Probleme & Ideen kennt jeder Programmierer natürlicherweise, nur konsequente Lösung mittels XP ist das schwierige)
  • Es gibt Planbarkeitsgrenzen in Softwareentwicklung. zB 6 by 6 = 6 Leute für 6 Monate. Mehr ist nicht planbar.

Pair-Programming

  • ein “Driver” programmiert aktiv und ein “Navigator” überlegt sich Abstraktion der Software, überwacht den Driver und diskutiert mit Driver Problemfälle
  • Bei zB Dokumentation ist Pair-Programming unangebracht. PP ist schwierigeren / komplexeren Aufgaben vorbehalten
  • PP bricht mit “der einsame Hacker im Keller” und “Know-How-Monopolen”
  • Externer, temporärer Experte kann sein Wissen durch Pair-Programming am besten verbreiten / teilen
  • Ungerade Entwicklerzahlen vermeiden bzw. klarsetzen, welche Aufgaben einzeln zu erfüllen sind bzw. mehrere Leute gemeinsam ihr Wissen bei einem Teilbereich austauschen sollten
  • Durch PP wird Austausch von Wissen gefördert: zu verwendenden Algorithmen, Verwendung von Programmiersprachen, Tricks des Texteditors, …

Standup-Meetings

  • Paarungen beim Pair-Programming werden beim Standup-Meeting festgelegt
  • Standup-Meetings werden am Beginn des Projekttags gehalten.
  • Jeder steht (damit Meeting nicht zeitlich ausufert).
  • Jeder erzählt von Aktivitäten & Problemen des Vortags und erzählt Pläne für heute. Redner sucht sich Partner für “Aufgaben des Tages”. Q: “Kannst du mir helfen?” Vorgeschriebene Antwort: “Ja”
  • Durch PP und Standup-Meetings ist klar, was jemand wann gemacht hat und Mitarbeiter werden für Urlaubszeiten oder Entlassungen ersetzbar

Source Code Management:

  • “Collective Code Ownership”: Jeder kann auf den ganzen Quelltext zugreifen und ihn verändern (zentrales Softwarerepository).
  • … bricht mit “wenn der Programmierer im Urlaub ist, ist sein Code auch im Urlaub”

Unittesting:

  • Sicherung der Softwarequalität mittels Unittests
  • Unittests erzeugen auch den (positiven?) Nebeneffekt, dass sich der Programmierer die API zuvor überlegen muss
  • Unittests sollten vor der Implementierung geschrieben werden und decken normale Fälle, Grenzfälle und Fehlerbehandlung ab
  • Es sollte ein Unittestframework genommen werden, welches den Automatisierungsprozess sehr vereinfacht und sich die Entwickler damit auch wohlfühlen

Dokumentation der Softwareentwicklung:

  • “User stories” in Form eines “Storyboard” niederschreiben – Details des Auftrags dokumentieren und Systemverhalten beschreiben
  • Priorisierung der Teilkomponenten (“musts”, “importants”, “nice to have”)
  • “musts” müssen vor den “nice to have”s erledigt werden, wobei zweitere mehr Spaß machen (dieser Widerspruch zu “agil” lässt sich nicht vermeiden)
  • Balance der Priorisierung muss gehalten werden (ein must mehr bedeutet ein vorhandenes must muss abgewertet werden)

Personal:

  • Alle Mitarbeiter mit XP vertraut machen und ein Leader muss Softwareentwicklung-Techniken überwachen / überblicken
  • Im Idealfall steht ein Vertreter (autorisiert & qualifiziert) der Interessengemeinschaft des Kunden durchgehend zur Verfügung (“Produktmanager”)
  • Für 1-2 Leute ungeeignet. Ideal für 5-6 Leute. Maximal 10 Leute in einer Gruppe.
  • Ab 10 Leuten lieber 2 separate Gruppen bilden und Mitglieder regelmäßig tauschen, damit Gruppen Anschluss zur anderen nicht verlieren.

Iterations-Zyklen & Engineering Tasks:

  • Sprecher empfiehlt 2-Wochen-Zyklus (“Iterations-Arbeits-Planung”) (Arbeit langfristig für 2 Wochen planen)
  • Jeder Entwickler hat “Engineering Tasks” und muss diese im Laufe des Projektes erfüllen. Die einzelnen Partner können dabei helfen.
  • In der Iterations-Arbeits-Planung müssen “Engineering Tasks” festgelegt werden
  • Ein ET umfasst etwa 1-3 Tage Arbeit. Alles darüber hinaus wäre nicht mehr zuverlässig abschätzbar.
  • Iterationen sollen Gefühl von Erfolge vermitteln und Zeit abschätzen beibringen
  • ET: Jeder schätzt Zeit die er für etwas braucht selbstständig
  • “Engineering-Task-Karten”: Definieren einzelne klare Arbeiten. Umfassen max. 1-2 Tagesarbeit
  • zB 2-4 Karten pro Entwickler pro 2 Wochen
  • ET werden nach Innovations- und Komplexitätsgrad definiert. Anhand der Grade kann mittels Metriken Zuverlässigkeit festgestellt werden
  • Reihenfolge der Kartenabarbeitung soweit irrelevant

Crunchtimes & Überstunden:

  • Crunchtimes (extreme Phasen vor dem Projektende um Zeitplan einzuhalten) vermeiden bzw. abbauen
  • Überstunden sind verboten, da sie Crunchtimes verursachen
  • Überstunden sollen nicht erwartet oder honoriert werden.
  • Begeisteter Programmierer darf noch freiwillig an Features/Off-Topic-Sachen arbeiten, aber dies wird nicht als Überstunde angerechnet.

Dokumentation:

  • Alles muss automatisiert laufen
  • Online-Dokumentation muss auch automatisiert aktuell gehalten werden

Technische XP-spezifische Werkzeug:

  • Gutes Build-System
  • Zentrales Repository
  • Automatisches Unittesting
  • Regressionstests

Zusatzideen:

  • Große Projekte: Alle 2 Monate größeres Release-Planungs-Treffen
  • Bei Google darf eine Zeitspanne lang komplett frei an einem beliebigen Projekt gearbeitet werden, solange man es danach präsentiert
  • “Infrastructure-Friday”: Halber Tag, in dem Werkzeuge im Vordergrund stehen und verbessert werden

Kernfeatures (wichtigste Komponenten) des XP:

  1. Iteratives Vorgehen
  2. Pair-Programming
  3. Automatische Tests
  4. Ehrlichkeit & Offenheit

Kritik an XP:

  • Idealer Kunde (wie er in Beispielen / Anleitungen) existiert nur selten
  • Gegenüber Anforderungen wie Pflichtenheft unflexibel
  • Manche Entwickler fühlen sich beim Pair-Programming unwohl und können erforderliche Offenheit & Ehrlichkeit nicht zur Verfügung stellen
  • Nicht gut für jede Projektgröße und für jede Entwicklergruppe

Empfohlene Literatur: Von XP-Experten Kent Beck (EN) und Frank Westphal (DE).

Notizen zu Extreme Programming (CRE 028)