Schlagwort-Archive: Video

Ich wette du hast nie geglaubt ich fahr, jetzt coworke ich schon ein Jahr auf Teneriffa

Lange war es ruhig in meinen Channels, was schlicht und ergreifend der vielen Arbeit in unserer neuen Firma co-IT.eu geschuldet war. Ich habe eine ganze Liste an Themen, die ich noch veröffentlichen will, aber starten werde ich mit Berichten aus Teneriffa – die Coworking Location meiner Wahl für den Monat März.

Was waren meine Beweggründe?

  • Die Zeit für Urlaub ist bei mir aktuell nicht gegeben, sodass ich eine urlaubsähnliche Umgebung angestrebt habe. Zudem schlägt mir das Wetter in Deutschland schon seit Jahren aufs Gemüt, sodass ich nach einer Möglichkeit gesucht habe dem künftig jährlich zu entfliehen.
  • Als Firma muss man mehr denn je für Mitarbeiter attraktiv sein, um beim War for Talent nicht den Kürzeren zu ziehen. Gepaart mit Ausflügen als Teambuilding Maßnahme planen wir kommendes Jahr für einige Tag hier her zu kommen. Vor Ort wollen wir Fachartikel schreiben, Social Media Content produzieren, Trainingsinhalte ausarbeiten und offene Diskussionen über Unternehmenswerte führen. Speziell letzteres ist meinem Verständnis nach für ein Startup elementar.
  • Effizienz: Bei meinen regelmäßigen Reflexionen sind mir Punkte aufgefallen, die primär das Thema Effizienz adressieren. Trotz Mehrarbeit – so scheint es mir – kommen am Ende weniger produktive Ergebnisse heraus. Der Wertstrom ist aber für mich persönlich die elementare Kennzahl, die stimmen muss. Wenn das nicht der Fall ist, muss am bestehenden System etwas geändert werden. Wer sich mit Effizienz beschäfigt, wird früher oder später über die Eisenhower-Matrix, die Theory of Constraints und vielleicht auch über das Standardwerk von Stephen Covey stolpern. In einem weiteren Beitrag werde ich hierauf noch eingehen.
  • Entschleunigung: Zwangsläufig musste ich mich nach dem Erkennen der obigen Probleme auch mit dem Thema Entschleunigung auseinander setzen.Dies gelingt am besten in einer neuen Umgebung. Bekanntlich haben unsere Nachbarn aus dem Süden diesbezüglich eine andere Mentalität als wir Deutschen. Deshalb bin ich gespannt, was ich hier für mich mitnehmen kann.

Wie wollte ich das lösen?

  • Zunächst einmal raus aus der alltäglichen Umgebung, raus aus der Telefonhölle und der täglichen Klein-Klein-Arbeit.
  • Weg, aber nicht zu weit weg, sodass ich, sollte ich künftig im Winter für 2-3 Monate in den Süden entfliehen, im Zweifel auch schnell für wichtige Meetings oder private Notfälle zuhause sein könnte.
  • Warm, aber nicht zu warm, denn bei der feuchtwarmen Hitze wie sie in Thailand oder der Dominikanischen Repulibik vorherrscht lässt es sich nicht mehr gut arbeiten.
  • Schnelles Internet ist die Grundvoraussetzung in meinem Beruf. Ich wollte mich nicht auf verkäuferähnliche Aussagen verlassen, sodass ich in meinem Bekanntenkreis nach Kontakten gesucht habe, die mir aus erster Hand von den Bedingungen vor Ort erzählen konnten.
  • Separate Büros standen ebenso auf meinem Zettel, da das Arbeiten in der Wohnung zwangsläufig wieder zur Mehrarbeit führen würde.

Was habe ich also gemacht?

Ich habe meine 7 Sachen gepackt, dazu jegliche Art der Elektronik und bin mit einer guten Freundin, die ebenfalls in der IT-Branche bei unserer befreundten Firma inovex arbeitet, nach Puerto de la Cruz in Teneriffa geflogen. Die Büros im Coworking Space kosten pro Monat 200€. Nach inzwischen 7 Tagen hier kann ich sagen, dass es sich problemlos produktiv arbeiten lässt.

In meiner Playlist auf YouTube könnt ihr das Experiment verfolgen. Inzwischen kam mir zu Ohren, dass Ralf Westphal zu dem Thema schon in der dotnetpro geschrieben hat. Den Artikel werde ich lesen, sobald ich wieder Zugriff auf den Leserbereich habe (danke Chris für den Hinweis!). Zum Bericht über das Internet vor Ort geht es hier.

Eine kleine Notiz am Rande: Den Beitrag habe ich nach dem Ansatz „Start with why“ von Simon Sinek verfasst.

Werbung

Session Die 4 tierischen Menschentypen

Eine spannende Session mit dem Namen „Die 4 tierischen Menschentypen“ gab es dieses Jahr beim Developer Open Space. Das Video habe ich euch in meinem YouTube Kanal zur Disposition gestellt.

Leider bin ich ein wenig zu spät eingestiegen, sodass ein Teil der Einführung fehlt. Macht nichts, denn hier hat Tobias Beck das toll erklärt.

Feedback ist wie immer willkommen. Wenn euch das Video gefällt, dann teilt/liked diesen Beitrag. Wer noch den Link zum Online Self Test möchte, kann mir das in die Kommentare schreiben. Den Blog von Gregor gibt es hier.

Session Unternehmenswerte

Auf das Thema Unternehmenswerte konnte ich schon aus vielen Blickwinkeln schauen: Ob als Mitarbeiter, als Geschäftsführers, als Selbstständiger oder Dienstleister. Umso mehr hat es mich gefreut, dass Daniel Marbach dazu eine Session vorgeschlagen hat. Teilnehmer gab es reichlich. Ich hätte mir zwar  gewünscht, dass mehr aktive Teilnehmer ihre Meinung bei der nach dem Fishbowl-Konzept geführten Diskussion geäußert hätten, aber insgesamt war es eine wirklich gelungene Session. Die Aufnahme hat ein wenig mit Schwächen bei Bild und Ton zu kämpfen, aber unser Schüler Tim hat sein Bestes gegeben, um in der Nachbearbeitung die nötige Qualität rauszuholen.

Das Video darf man gerne als Einladung zur Diskussion verstehen. Deshalb halte ich hier die Punkte fest, die mir im Kopf geblieben sind:

Duzen/Siezen: Ein diskussionswürdiger Punkt, bei dem die Meinungen sicherlich auseinandergehen. In jedem Fall springen immer mehr Unternehmen auf den „Du-Zug“ auf. Klar ist aber auch: Die Anrede muss zur Unternehmenskultur passen. Ein Beispiel aus meinem Alltag sei genannt: Wenn unser Tim, Schüler, kürzlich erst 18 geworden, mit mir arbeitet, dann würde durch das Siezen aus meiner Sicht eine Hürde aufgebaut werden, die ihn bei der Arbeit weniger kreativ und in Bezug auf seine Lösungsansätze weniger „probierfreudig“ machen würde. Die Angst Fehler zu machen und sich an die Vorgaben des Chefs halten zu müssen, wird durch das Duzen einfach gemindert.

Kommunikationsnähe: Kommunikation findet bekanntlich zum Großteil nonverbal statt. Deshalb ist es umso wichtiger, eine möglichst hohe „Kommunikationsnähe“ zu erreichen. Sei es durch regelmäßige Treffen vor Ort (bei verteilten Mitarbeitern) oder durch Videokonferenzen. Chats und E-Mails sollten mehr durch die vorher genannten Punkte ersetzt werden. Für mich wird dabei einfach mehr Menschlichkeit vermittelt, die auch größere Meinungsunterschiede überwinden lässt.

Rituale: Halte ich ebenfalls für sehr effektiv. Seien es nun das Kickern oder Schachspielen in der Mittagspause, das Feierabend-Darts, das TGIF-Bierchen oder das Daily (als Videokonferenz!): Alles trägt zur besseren Kultur bei. Daniel hat mir einmal erzählt, dass bei Particular Videogespräche häufig mit einem „Kaffee-Gespräch“ über das allgemeine Befinden beginnen, bevor über Geschäftliches gesprochen wird.

Loben: Das ist nun mein persönliches Steckenpferd, wobei ich mit meiner Meinung vermutlich eine Minderheit vertrete. Ich halte Lob für Gift. Ein paar Argumente könnt ihr dazu im Video hören. Auf Twitter wurde dazu auch noch etwas gesagt. Dieser Link wurde in dem Kontext empfohlen. Weitere Informationen gibt es hier.

Persönlichkeitsanalyse: Das finde ganz spannend. Mehrere Firmen haben schon Persönlichkeitsanalysen für ihre Mitarbeiter durchführen und diese dazu schulen lassen, um Konfliktpotential zu erkennen und jedem Werkzeuge an die Hand zu geben, sich auf den Kollegen/die Kollegin einzustellen. Im Nachhinein hat mir noch ein Teilnehmer erzählt, dass bei ihnen die Projektgruppen nach dem Ergebnis zusammengestellt wurden. Alle, bei denen dies umgesetzt wurde, haben sich dazu positiv geäußert.

Wenn euch der Artikel geholfen hat, dann liked oder teilt ihn und hinterlasst einen Kommentar

Hinweis: Das Beitragsbild hat mir Andreas Richter zur Verfügung gestellt.

Gitolite Berechtigungssystem

In diesem Video gebe ich einen Einblick in das Berechtigungssystem von Gitolite. Ich spreche über Zugriffsgruppen, über das Vererbungssystem, über Wild Repos, über mögliche Einsatzszenarien und einiges mehr. Eine ausführliche Dokumentation findet ihr hier.

Die 2 im Video genannten Befehle waren

  1. Prüfung der Berechtigungen für ein Repository (zur Doku): Im Beispiel wird geprüft, ob der User ‚uli.armbruster‘ Berechtigung zum Löschen des ‚master‘-Branch im Repository ‚co-it/homepage‘ hat.gitolite access -s co-it/homepage uli.armbruster D refs/heads/master 
  2. Übersteuern von Berechtigungen am Repository selbst: In dem Beispiel würde mir Gregor auf sein userspezifisches-Repository ‚users/gregor.woiwode/spike1‘ Lesezugriff geben.ssh git@ci.heco.de perms users/gregor.woiwode/spike1 + READERS uli.armbruster

 

Bei Fragen einfach nutzt die Kommentarfunktion oder kontaktiert mich direkt.

Videoserie: Alles was man über IT Berufe wissen sollte und warum 45 Jahre zu lang für den falschen Beruf sind

Alles was man über IT Berufe wissen sollte…

und warum 45 Jahre zu lang für den falschen Beruf sind!

 

Meine Motivation hinter der 3-teiligen Serie war es eine Hilfestellung bei der Berufswahl zu geben. Während Schlagworte wie „zukunftssicher“ und „lukrativ“ in nahezu jedem Artikel zu finden sind und der Konsens der ist, dass man „etwas mit IT“ studieren sollte, gebe ich euch eine etwas andere Sichtweise auf das Thema. Wie Albert Einstein schon postulierte:

Wenn du es nicht einfach erklären kannst, hast du es nicht gut genug verstanden.

 

Deshalb fasse ich den Inhalt der Serie wie folgt zusammen:

happiness

Beruf kommt von Berufung

 

Diejenigen, die ein klein wenig mehr Zeit haben, können anhand dieses 2-minütigen Einleitungsvideos entscheiden, ob die Serie für sie interessant ist:


Hier geht es zur kompletten Serie.

Wenn euch der Beitrag gefällt, dann teilt ihn und hinterlasst mir einen Kommentar. Wen ein Interview aus mehreren IT-lern unterschiedlicher Studiengänge und Hochschulen interessieren würde, der darf sich gerne melden, dann stelle ich dazu etwas auf die Beine.

Erwähnte Links in den Videos:

 

Anwender durch zielgerichtete Release Notes in die Produktentwicklung integrieren

In diesem Video zeige ich eine von vielen maßgeschneiderten Funktionen unseres Release Prozesses. Das Ziel dabei war es die Anwender noch mehr in die Produktentwicklung einzubinden.

Die langfristige Vision: Anwender bringen selbst die Anforderungen ein. Wie das genau gemeint ist und wie wir das umgesetzt haben, seht ihr im Video. Unter anderem kommen YouTrack und TeamCity zum Einsatz.

 

Über ein Rake-Skript, welches auf ein bereits existierendes YouTrack-Gem zurückgreift, sprechen wir die Rest-API an. Vielen Dank an Alexander Groß von GROSSWEBER für die Hilfe bei der Umsetzung unserer Vision.

require 'youtrack'
require 'ostruct'
module Build
class YouTrack
class View
attr_reader :issues, :by_department, :by_relevance
def initialize(issues)
@issues = issues
@by_department = department(issues)
@by_relevance = relevance(issues)
end
private
def department(issues)
create_view(issues, proc { |issue| issue.departments })
end
def relevance(issues)
create_view(issues, proc { |issue| issue.relevant_to })
end
def create_view(issues, group_by)
view = issues.inject({}) do |memo, issue|
group_by.call(issue).each do |rel|
previous_value = memo.fetch(rel, [])
new_value = previous_value << issue
memo[rel] = new_value.sort_by(&:issue_id)
end
memo
end
Hash[view.sort]
end
end
class << self
NOT_FOUND = proc { { 'value' => nil } }
def fixed_issues(from, to)
resource = client.issues
maybe_patch_unreleased_methods(resource)
query = query(from, to)
puts "Getting issue list from YouTrack using query: #{query}"
issues = resource.list(filter: query, max: 1000)
issues = force_list(issues)
transformed = transform(issues)
View.new(transformed)
end
private
def client
@client ||= Youtrack::Client.new do |c|
c.url = 'your-url'
c.login = 'your-user'
c.password = 'your-pw'
c.connect!
end
end
def maybe_patch_unreleased_methods(issues)
return if issues.respond_to?(:list)
warn 'Patching #list method'
# Get a list of issues for a search query.
#
# attributes
# filter string A query to search for issues.
# with string List of fields that should be included in the result.
# max integer Maximum number of issues to get. If not provided, only 10 issues will be returned by default.
# after integer A number of issues to skip before getting a list of issues.
#
def issues.list(attributes = {})
attributes[:max] ||= 10
get("issue?#{URI.encode_www_form(attributes)}")
end
end
def query(from, to)
"project: HECO_comWORK Fixed in build: #{from} .. #{to} Department: -KEINE #{excluded_subsystems}"
end
def excluded_subsystems
spec = ENV['RELEASE_NOTES_EXCLUDE_SUBSYSTEMS']
return unless spec
spec = spec.split(',')
return if spec.empty?
"Subsystem: #{spec.map { |s| "-{#{s}}" }.join(' ')}"
end
def force_list(issues)
issues = issues.to_hash['issueCompacts']['issue'] rescue []
([] << issues).flatten(1)
end
def transform(issues)
issues.map do |x|
field = x['field']
project = field.find { |f| f['name'] == 'projectShortName' }['value']
number = field.find { |f| f['name'] == 'numberInProject' }['value']
issue_id = "#{project}-#{number}"
subsystem = subsystem(field)
summary = field.find { |f| f['name'] == 'summary' }['value']
info = field.find(NOT_FOUND) { |f| f['name'] == 'Release Infotext' }['value']
departments = arrayify(field, 'Department')
relevant_to = arrayify(field, 'Relevant to')
OpenStruct.new(issue_id: issue_id,
subsystem: subsystem,
summary: summary,
info: info,
departments: departments,
relevant_to: relevant_to)
end
end
def subsystem(field)
value = field.find { |f| f['name'] == 'Subsystem' }['value']
return nil if value == 'No Subsystem'
value
end
def arrayify(field, key)
value = field.find(NOT_FOUND) { |f| f['name'] == key }['value']
return [] if value.nil?
([value]).flatten.sort
end
end
end
end
view raw youtrack.rb hosted with ❤ by GitHub

Wer weitere Einblicke in unseren Prozess bekommen möchte, der kann mir dazu einen Kommentar hinterlassen.


require 'youtrack'
require 'ostruct'
module Build
class YouTrack
class View
attr_reader :issues, :by_department, :by_relevance
def initialize(issues)
@issues = issues
@by_department = department(issues)
@by_relevance = relevance(issues)
end
private
def department(issues)
create_view(issues, proc { |issue| issue.departments })
end
def relevance(issues)
create_view(issues, proc { |issue| issue.relevant_to })
end
def create_view(issues, group_by)
view = issues.inject({}) do |memo, issue|
group_by.call(issue).each do |rel|
previous_value = memo.fetch(rel, [])
new_value = previous_value << issue
memo[rel] = new_value.sort_by(&:issue_id)
end
memo
end
Hash[view.sort]
end
end
class << self
NOT_FOUND = proc { { 'value' => nil } }
def fixed_issues(from, to)
resource = client.issues
maybe_patch_unreleased_methods(resource)
query = query(from, to)
puts "Getting issue list from YouTrack using query: #{query}"
issues = resource.list(filter: query, max: 1000)
issues = force_list(issues)
transformed = transform(issues)
View.new(transformed)
end
private
def client
@client ||= Youtrack::Client.new do |c|
c.url = 'your-url'
c.login = 'your-user'
c.password = 'your-pw'
c.connect!
end
end
def maybe_patch_unreleased_methods(issues)
return if issues.respond_to?(:list)
warn 'Patching #list method'
# Get a list of issues for a search query.
#
# attributes
# filter string A query to search for issues.
# with string List of fields that should be included in the result.
# max integer Maximum number of issues to get. If not provided, only 10 issues will be returned by default.
# after integer A number of issues to skip before getting a list of issues.
#
def issues.list(attributes = {})
attributes[:max] ||= 10
get("issue?#{URI.encode_www_form(attributes)}")
end
end
def query(from, to)
"project: HECO_comWORK Fixed in build: #{from} .. #{to} Department: -KEINE #{excluded_subsystems}"
end
def excluded_subsystems
spec = ENV['RELEASE_NOTES_EXCLUDE_SUBSYSTEMS']
return unless spec
spec = spec.split(',')
return if spec.empty?
"Subsystem: #{spec.map { |s| "-{#{s}}" }.join(' ')}"
end
def force_list(issues)
issues = issues.to_hash['issueCompacts']['issue'] rescue []
([] << issues).flatten(1)
end
def transform(issues)
issues.map do |x|
field = x['field']
project = field.find { |f| f['name'] == 'projectShortName' }['value']
number = field.find { |f| f['name'] == 'numberInProject' }['value']
issue_id = "#{project}#{number}"
subsystem = subsystem(field)
summary = field.find { |f| f['name'] == 'summary' }['value']
info = field.find(NOT_FOUND) { |f| f['name'] == 'Release Infotext' }['value']
departments = arrayify(field, 'Department')
relevant_to = arrayify(field, 'Relevant to')
OpenStruct.new(issue_id: issue_id,
subsystem: subsystem,
summary: summary,
info: info,
departments: departments,
relevant_to: relevant_to)
end
end
def subsystem(field)
value = field.find { |f| f['name'] == 'Subsystem' }['value']
return nil if value == 'No Subsystem'
value
end
def arrayify(field, key)
value = field.find(NOT_FOUND) { |f| f['name'] == key }['value']
return [] if value.nil?
([value]).flatten.sort
end
end
end
end

view raw

youtrack.rb

hosted with ❤ by GitHub


require 'youtrack'
require 'ostruct'
module Build
class YouTrack
class View
attr_reader :issues, :by_department, :by_relevance
def initialize(issues)
@issues = issues
@by_department = department(issues)
@by_relevance = relevance(issues)
end
private
def department(issues)
create_view(issues, proc { |issue| issue.departments })
end
def relevance(issues)
create_view(issues, proc { |issue| issue.relevant_to })
end
def create_view(issues, group_by)
view = issues.inject({}) do |memo, issue|
group_by.call(issue).each do |rel|
previous_value = memo.fetch(rel, [])
new_value = previous_value << issue
memo[rel] = new_value.sort_by(&:issue_id)
end
memo
end
Hash[view.sort]
end
end
class << self
NOT_FOUND = proc { { 'value' => nil } }
def fixed_issues(from, to)
resource = client.issues
maybe_patch_unreleased_methods(resource)
query = query(from, to)
puts "Getting issue list from YouTrack using query: #{query}"
issues = resource.list(filter: query, max: 1000)
issues = force_list(issues)
transformed = transform(issues)
View.new(transformed)
end
private
def client
@client ||= Youtrack::Client.new do |c|
c.url = 'your-url'
c.login = 'your-user'
c.password = 'your-pw'
c.connect!
end
end
def maybe_patch_unreleased_methods(issues)
return if issues.respond_to?(:list)
warn 'Patching #list method'
# Get a list of issues for a search query.
#
# attributes
# filter string A query to search for issues.
# with string List of fields that should be included in the result.
# max integer Maximum number of issues to get. If not provided, only 10 issues will be returned by default.
# after integer A number of issues to skip before getting a list of issues.
#
def issues.list(attributes = {})
attributes[:max] ||= 10
get("issue?#{URI.encode_www_form(attributes)}")
end
end
def query(from, to)
"project: HECO_comWORK Fixed in build: #{from} .. #{to} Department: -KEINE #{excluded_subsystems}"
end
def excluded_subsystems
spec = ENV['RELEASE_NOTES_EXCLUDE_SUBSYSTEMS']
return unless spec
spec = spec.split(',')
return if spec.empty?
"Subsystem: #{spec.map { |s| "-{#{s}}" }.join(' ')}"
end
def force_list(issues)
issues = issues.to_hash['issueCompacts']['issue'] rescue []
([] << issues).flatten(1)
end
def transform(issues)
issues.map do |x|
field = x['field']
project = field.find { |f| f['name'] == 'projectShortName' }['value']
number = field.find { |f| f['name'] == 'numberInProject' }['value']
issue_id = "#{project}#{number}"
subsystem = subsystem(field)
summary = field.find { |f| f['name'] == 'summary' }['value']
info = field.find(NOT_FOUND) { |f| f['name'] == 'Release Infotext' }['value']
departments = arrayify(field, 'Department')
relevant_to = arrayify(field, 'Relevant to')
OpenStruct.new(issue_id: issue_id,
subsystem: subsystem,
summary: summary,
info: info,
departments: departments,
relevant_to: relevant_to)
end
end
def subsystem(field)
value = field.find { |f| f['name'] == 'Subsystem' }['value']
return nil if value == 'No Subsystem'
value
end
def arrayify(field, key)
value = field.find(NOT_FOUND) { |f| f['name'] == key }['value']
return [] if value.nil?
([value]).flatten.sort
end
end
end
end

view raw

youtrack.rb

hosted with ❤ by GitHub

Docker Session am NET Open Space Süd 2015

Aus aktuellem Anlass (Workshop am devspace2015) das Video zu Docker, in welchem Alexander Zeitler uns in einer Live Demo das Ökosystem vorstellt.

Alexander Zeitler stellt Docker vor.

Durch Klicken gelangt ihr zum Video.

WordPress, TYPO3 CMS, TYPO3 NEOS – Anforderungen an ein gutes Content Management System

Die Anforderungsanalyse ist das A und O in Entscheidungsprozessen über Software-Systeme. In einem Praxisbeispiel zeige ich euch unser Ergebnis bei der Auswahl des neuen Content Management Systems. Dabei erkläre ich, was funktionale und nicht-funktionale Anforderungen sind, mit welchen Prioritäten wir diese unterscheiden und nenne Do’s & Don’ts von evaluierbaren Anforderungen.

Durch Klicken auf das Bild geht es zum YouTube Video

Durch Klicken auf das Bild geht es zum YouTube Video

Webseiten Baukästen können teuer werden

Oder doch nicht? Das könnt ihr erst bewerten, wenn ihr ein Mindestmaß an Hirnschmalz reingesteckt habt. Gerade kleine und mittelständische Unternehmen (KMUs), die vielleicht auch nur wenige Produkte im Portfolio haben, gehen zu schnell an die Umsetzung und verbrennen dadurch mehr Geld als notwendig. In dem Video gebe anhand eines Praxisbeispieles ein paar Fragen mit, die ihr euch stellen könnt. Das sind z.B.

  • Anbindung bestehender Systeme (ERP zur Bestandsanzeige)
  • Mehrsprachigkeit
  • Tracking
  • Google-Optimierung
  • Online Shopping
  • Kundengruppen / Personas
  • Inhaltstypen (Text, Bild, Tabellen, Videos, interaktive Elemente)
  • Redakteure bzw. wer pflegt die Inhalte
  • Wie oft ändern sich die Inhalte
  • Mobile-Optimierung
  • und einige mehr

Das Video soll euch nur ein paar anfängliche Ideen geben. Es gibt noch viele weitere Punkte und am Ende steht eine Anforderungsanalyse wie >hier< (Link folgt später).

Hier geht es zum YouTube Video.

Durch Klicken auf das Bild geht es zum Video

Die großen 4: Pfadfinderregel, Wirtschaftlichkeit, Clean Code, SOLID Principles

Was ist damit gemeint? Gemäß der Pfadfinderregel soll ein Entwickler Code immer besser hinterlassen, als er ihn vorgefunden hat. Clean Code oder guter Code ist häufig dann erreicht, wenn das Mindestmaß an essentiellen Code Prinzipien umgesetzt ist. Das sind die sogenannten SOLID Principles. Jedoch ist guter Code kein Selbstzweck, sondern dient dem größeren Ziel der Wirtschaftlichkeit.

Im folgenden Video zeige ich an einem Praxisbeispiel, wie ich bei einem bestehendem, eher unwichtigem Projekt vorgegangen bin. Timeboxed in 1h so viel refaktorisieren und den Code verbessern wie möglich. Dabei gehe ich auf Prinzipien wie DRY und OCP ein und zeige Techniken wie DI, sowie Tools wie den IoC Container Castle Windsor.

Feedback nehme ich wie immer gerne mit. Wenn ihr mehr von solchen Videos sehen wollt, schreibt mir das in die Kommentare, damit ich weiß: Hier lohnt es sich mehr zu machen.

Zum YouTube Video

Durch Klicken auf das Bild geht es zum Video

Nachgefragt – Interview mit Daniel Marbach zu MSpec

In einem Online Interview habe ich Daniel Marbach zur Zukunft des Open Source BDD Frameworks MSpec befragt. Herausgekommen ist eine Aufnahme, die es jetzt auf YouTube gibt. Die Fragen wurden nicht vorab abgesprochen, um ein authentisches statt ein werbelastiges Gesprächs zu führen.

 

image

Auf das Bild klicken um zum Video zu gelangen

 

An dieser Stelle möchte ich noch die Community aufrufen sich an der Weiterentwicklung zu beteiligen. Open Source Projekte leben von freiwilligen Helfern und Daniel macht da eine sehr gute Arbeit und ein tolles Produkt!

Fragen

  • Machine.Specifications
  • Was ist eigentlich ein BDD Framework
  • Stärken
  • Schwächen
  • Roadmap
  • Wie steht es um die Zukunftssicherheit
  • Tipps und Tricks
  • Ergänzende Frameworks
  • Gute Tests

 

Show Notes

Interview mit Daniel Marbach mitgestalten

Am 18. März wird mir Daniel Marbach ein Video Interview zu dem BDD-Framework Machine.Specifications geben. Ein kleiner Vorgeschmack gefällig?

Wodurch hebt sich MSpec von anderen BDD-Frameworks ab?

oder

Welche Features sind gerade in der Pipeline?

oder

Welche anderen Frameworks ergänzen MSpec gut?

Das Video veröffentliche ich dann auf meinem YouTube Channel. Ihr könnt die Richtung des Gesprächs mitgestalten, indem ihr mir rechtzeitig eure Fragen in die Kommentare postet.

Nachgefragt – dotnetpro Interview mit Tilman Börner

In einem Online Interview habe ich Tilman Börner über die digitale Zukunft der dotnetpro und die Anforderungen an potentielle Autoren befragt. Herausgekommen ist eine Aufnahme, die es jetzt auf YouTube gibt. Die Fragen wurden vorab nicht abgesprochen, um eine Gesprächsatmosphäre zu schaffen, wie sie bei einer Kaffeepause üblich ist.

Danke nochmal Tilman!

 

Interview mit Tilman Börner

 

Fragen

  • Angehende Autoren
    • Formale Anforderungen an einen potentiellen Autor
    • Formale Anforderungen an einen Artikel
    • Von der Idee bis zum fertigen Artikel: Das Prozedere kurz erläutert
    • Was macht einen guten Autor aus?
  • Änderungen am Magazin
    • Gibt es gerade einen Umbruch?
    • Finden Themenverschiebung statt?
  • Die Digitale Welt
    • Wird es vollwertige Ausgaben für Android und Kindle geben?
    • Wann bekommt die Homepage einen neuen Anstrich?

 

Show Notes

Interview mit der dotnetpro mitgestalten

Am 12. März werde ich mit Tilman Börner ein Online Interview führen. Die Fragen beziehen sich natürlich primär auf die dotnetpro. Ein kleiner Vorgeschmack gefällig?

Kann jeder einfach Autor werden und einen Artikel schreiben?

oder

Wann können wir mit einer Kindle Ausgabe rechnen?

oder

Welche Änderungen sind dieses Jahr nach dem Design Relaunch noch zu erwarten?

Das Video veröffentliche ich dann auf meinem YouTube Channel. Ihr könnt die Richtung des Gesprächs mitgestalten, indem ihr bis zum 11 März eure Fragen in die Kommentare postet.

Nachgefragt – Clean Code Interview mit Ralf und Stefan

In einem Online Interview habe ich Ralf Westphal und Stefan Lieser, die Gründer der Clean Code Developer School, zum Thema Clean Code befragt. Herausgekommen ist eine Aufnahme, die es jetzt auf YouTube gibt. Die Fragen wurden nicht vorab abgesprochen, um eine Gesprächsatmosphäre zu schaffen, wie es sie bei einer Kaffeepause gibt.

Es war ein toller Gedankenaustausch. Danke nochmal ihr zwei!

Zum Video

Zum Video

Fragen

  • Wenn ihr euch für eine Konferenz entscheiden müsstet, welche wäre das?
  • Community vs. Freizeit: Wie ist das vereinbar
  • Wann ist Clean Code noch sinnvoll und wann verschlimmbessere ich nur noch?
  • Macht Clean Code Sinn, wenn die Kollegen nicht mitziehen?
  • Wird das Schreiben von gutem Code mit der Zeit einfacher?
  • Ist guter Code relativ?
  • Was erwartet ein Arbeitgeber, wenn er Clean Code in der Stellenausschreibung aufführt?
  • Was kann ich von einem Bewerber erwarten, wenn er Clean Code in der Stellenausschreibung aufführt?
  • Verschiedene Ansätze für bessere Architektur, z.B. Flow Design
  • Brauche ich für Flow Design einen IoC Container?

Für die Zukunft sind weitere Interviews geplant:

  • Mit Daniel Marbach zu Machine.Specifications
  • Mit Tilman Börner zur dotnet pro
  • Mit Steffen Forkmann zur paket

Falls ihr noch Ideen habt, dann schreibt sie in die Kommentare.

Interview mit Ralf Westphal und Stefan Lieser

Am 22.1. werde ich abends ein Online Interview mit den Clean Code Koryphäen Ralf Westphal und Stefan Lieser führen. Die Fragen werden thematisch weit gestreut sein. Ein kleiner Vorgeschmack gefällig?

Macht Clean Code Sinn, wenn die Kollegen nicht mitziehen?

oder

Community vs. Freizeit: Wie ist das vereinbar?

oder

Woher weiß ich, wann ich es mit Clean Code übertreibe?

Das Video veröffentliche ich dann auf meinem YouTube Channel. Ihr könnt die die Richtung des Gesprächs mitgestalten, indem ihr bis ca. 15 Uhr eure Fragen in die Kommentare postet.

Konsequente Objektorientierung – Die besseren Methodenparameter

Kürzlich habe ich eine Lösung zugeschickt bekommen, die folgende Methode enthielt.

   1: public bool compare(string item1, string item2)

   2: {

   3:     if (item1 == null || item2 == null)

   4:         return false;

   5:  

   6:     //more code

   7: }

 

In diesem Webcast möchte ich einen Ansatz zeigen, den ich als gute Alternative zu obigem Code sehe. Dabei setze ich konsequent auf Objektorientierung zur Trennung der Aspekte.

Tipps zum Customer Relationship Management in kleinen und mittleren Unternehmen

Mit folgendem Webcast möchte ich kleine und mittlere Unternehmen (KMU) einen groben Überblick geben, was es bei der Auswahl von Customer Relationship Management (CRM) Systemen zu beachten gilt. In 20 Minuten mache ich eine kurze Analyse und erkläre den unterschied von funktionalen und nicht-funktionalen Anforderungen. Dabei ist es wichtig zu wissen, dass die nicht-funktionalen zwar nicht sichtbar sind, aber durchaus teuer werden können. Am Schluss nenne ich dann einige Produkte, die sich primär in interne und externe Lösungen (Stichwort Cloud) kategorisieren lassen. Bei der Auswahl wird dann der Rückschluss auf die Anforderungsanalyse gezogen.

 

Hier geht es zum Video. Wer sich fragt, welches Programm ich zur Aufbereitung verwende. Es handelt sich um den MindManager der Firma MindJet.

CRM

Hier sind noch weiterführende Informationen:

Bessere Enumerations in NET

Ist euch der Smell von typischen Enumerations auch schon in die Nase gestiegen? In diesem Webcast zeige ich eine Alternative zu den typischen Enums in NET. Damit können das Open Closed Principle und Separation of Concerns besser umgesetzt werden, was meiner Meinung nach zu einer höheren Kohäsion führt.

 

Weiterführende Links:

 

Wie haltet ihr es mit Enums? Arbeitet ihr schon auf diese Weise? Wollt ihr mehr Webcasts zu Clean Code?

Flexibles Bootstrapping durch Composition

In diesem Webcast zeige ich unseren Kompositions-Ansatz für das Bootstrapping. Die Interfaces sind schmal, die Implementierungen überschaubar, das Ganze ist flexibel und lässt sich gut testen.

Hier der gezeigte Code:

   1: public class BootstrapperContext

   2: {

   3:     public BootstrapperContext()

   4:     {

   5:         AppConfig = new ApplicationConfig();

   6:         Container = new WindsorContainer();

   7:     }

   8:  

   9:     public IWindsorContainer Container { get; private set; }

  10:     public ApplicationConfig AppConfig { get; private set; }

  11: }

   1: public interface IAmABootstrapperAction

   2: {

   3:     void Execute(BootstrapperContext context);

   4: }

 

   1: public interface IAmABootstrapperComposition

   2: {

   3:     IEnumerable<IAmABootstrapperAction> Actions { get; }

   4: }

 

   1: public class BootstrapperExecutor

   2: {

   3:     public static void StartupApplication(IAmABootstrapperComposition bootstrapperComposition)

   4:     {

   5:         var exceptionMessage = "Beim Starten der Anwendung ist ein Fehler aufgetreten. Bitte den Support kontaktieren.\n\n";

   6:  

   7:         if (bootstrapperComposition.Actions == null || !bootstrapperComposition.Actions.Any())

   8:         {

   9:             throw new BootstrapperException(exceptionMessage, new ArgumentOutOfRangeException("Auf dem Bootstrapper waren keine Actions definiert"));

  10:         }

  11:  

  12:         var context = new BootstrapperContext();

  13:  

  14:         var time = TimedAction.Run(() =>

  15:                                    {

  16:                                        foreach (var action in bootstrapperComposition.Actions)

  17:                                        {

  18:                                            var actionName = action.GetType().Name;

  19:                                            SiAuto.Main.LogMessage(string.Format("{0} gestartet", actionName));

  20:  

  21:                                            var timeTaken = TimedAction.Run(() => { ExecuteAction(action, context, exceptionMessage); });

  22:  

  23:                                            SiAuto.Main.LogMessage(string.Format("{0} in {1} erfolgreich durchgeführt",

  24:                                                                                 actionName,

  25:                                                                                 timeTaken.Format())

  26:                                                );

  27:                                        }

  28:                                    });

  29:     }

  30:  

  31:     private static void ExecuteAction(IAmABootstrapperAction action, BootstrapperContext context, string exceptionMessage)

  32:     {

  33:         try

  34:         {

  35:             action.Execute(context);

  36:         }

  37:         catch (Exception ex)

  38:         {

  39:             SiAuto.Main.LogException(string.Format("Fehler beim Bootstrapping: {0}", ex.GetFullExceptionMessage()), ex);

  40:             throw new BootstrapperException(string.Format("{0}{1}", exceptionMessage, ex.GetFullExceptionMessage()), ex);

  41:         }

  42:     }

  43: }

 

Welchen Ansatz verfolgt ihr?

Fragen oder Feedback könnt ihr mir gerne als Kommentar hinterlassen.

Open Space in 12 Minuten

Ich wurde von Daniel Marbach eingeladen per Konferenzschaltung einen kurzen Überblick zum Open Space Format zu geben. Das Video dazu habe ich auf YouTube veröffentlich. Feedback ist immer willkommen.

Mein Artikel zu dem Thema wurde in der dotnetpro in Ausgabe 02/2014 veröffentlicht. Ein herzliches Dankeschön an dieser Stelle für die Freigabe!

Firma inovex bei uns im Haus

Kürzlich war Stefan Kirner, Senior Business Intelligence Consultant der inovex GmbH, bei uns im Haus. Mit seiner Hilfe haben wir unseren Microsoft SQL Server optimiert, welcher als Datenbank für unser hauseigenes ERP-System dient. Indizes, Queries, Konfigurationseinstellungen – alles haben wir auf den Prüfstand gestellt. Die Zusammenarbeit mit Stefan war sehr angenehm und produktiv. Im Anschluss habe ich noch ein kleines Interview mit ihm geführt. Leider gab es Probleme mit der Kamera, sodass das Bild ein wenig gelitten hat:

Direkt zum Video geht es hier.

Stefan Kirner spricht über die SQLPass

Stefan spricht in seinem Interview über die SQLPass. An dieser Stelle sei nochmal darauf hingewiesen, dass für dieses Jahr noch Sprecher mit Vorträgen gesucht werden.

Entschuldigt die schlechte Bildqualität. Wir hatten leider technische Probleme.

Mehr Interviews findet ihr in meiner Playlist auf YouTube.

Excel Online Training #1 – Webstatistik

Viele Entwickler wissen gar nicht um die Mächtigkeit von Excel. Oftmals lässt sich mit 5 Minuten in Excel das Schreiben von Programmcode gänzlich vermeiden.

Wie seht ihr das? Nutzt ihr die Möglichkeiten von Excel? Oder gibt es Wissenslücken zu füllen? Dann schreibt mir wozu ich noch Videos aufnehmen könnte.

Developer Open Space 2013 – Live aus den Sessions

In dem unten stehenden Video zeige ich euch Aufnahmen aus den Sessions. Generell ist es so, dass die Person, die ein Session-Thema vorschlägt, gleichzeitig als Session Hoster fungiert. Dazu ist es nicht notwendig, dass der Session-Hoster sich besonders gut mit der Materie auskennt. Seine Funktion zielt darauf ab einen offen Dialog zu gewährleisten und das sogenannte Kapern von Sessions, d.h. das Abdriften vom Thema, zu verhindern.

Erfahrungsgemäß laufen Sessions oft in 2 Formen ab:

  • Sehr rege Beteiligung aller Teilnehmer bei Themen, zu denen jeder etwas sagen kann. Ein Beispiel hierzu wäre Scrum.
  • Bei Randthemen oder komplexen Dingen ist es meistens so, dass 1-3 Personen über die eigenen Erfahrungen berichten. Das waren in diesem Jahr beispielswese die Sessions “Werteunterschiede” und “Psychologie bei Softwareentwicklung”.

Mir scheint es auch, dass v.a. in den letzten 2 Jahren immer mehr Sessions außerhalb des Technologie-Stacks aufkommen. Persönlichkeitstypen und Selbstständigkeit / Freelancing um zwei Vertreter zu nennen. Zumindest ich persönlich begrüße dies sehr!

Hier nun zum Video (Direktlink auf YouTube):

Developer Open Space 2013 – Sessionplanung

Damit der ein oder andere eine konkrete Vorstellung davon bekommt, wie eine Agenda auf einem Open Space entsteht, habe ich das live aufgenommen und publiziert.

In Leipzig findet in der Regel Freitagabends ein sogenanntes World-Café statt. Dabei sind alle Beteiligten dazu angehalten Sessionthemen vorzuschlagen, konstruktiv zu diskutieren und für den Folgetag aufzuschreiben. Die Teilnehmer können die Ergebnisse als Vorschläge und Inspiration in den nächsten Tag mitnehmen.

Samstags und Sonntags findet dann das gemeinsame Erstellen der Agenda (öfters auch Product Backlog genannt) statt. Vom World-Café können, müssen aber nicht dann Sessions vorgeschlagen werden. Der Teilnehmer, der das Thema anregt, ist immer auch der Session Hoster. Ihm obliegt die Entscheidung wann und wo die Session stattfindet. Darüber hinaus nimmt der die Moderatorenrolle ein und verhindert ggf. das “Kapern” einer Session, d.h. das Abdriften in nicht Session-relevante Themen.

Nach der Sessionvorstellung holt sich der Hoster kurzes Feedback per Handzeichen ein, wie viel Interesse besteht. Eventuell melden sich auch Teilnehmer, die das Thema gerne erweitern bzw. konkretisieren möchten, um eigene Schwerpunkte einzubringen und eine gemeinsame Session zu halten.

So viel in aller Kürze zur Agendafindung. Hier nun das Video:

Developer Open Space – Interview mit Janek Fellien

In meinem Interview am Developer Open Space in Leipzig (#devspace) spreche ich mit Janek über seine favorisierten Sessions und den Vergleich zw. typischen Konferenzen und dem Open Space als Unkonferenz.

Den Link, der euch direkt auf YouTube führt, findet ihr hier. Ich würde euch allerdings bitten beim Teilen den Blog Link zu verwenden.

 

NET Open Space – Interview mit Constantin Klein

In meinem Interview am .NET Open Space in Karlsruhe (#nossued) spreche ich mit Kostja über seine favorisierten Sessions und den Vergleich zw. typischen Konferenzen und dem Open Space als Unkonferenz.

Der Link, der euch direkt auf YouTube führt, findet ihr hier. Ich würde euch allerdings bitten beim Teilen den Blog Link zu verwenden.

NET Open Space – Interview mit Manuel Naujoks

In meinem Interview am .NET Open Space in Karlsruhe (#nossued) spreche ich mit Manuel über seine favorisierten Sessions und den Vergleich zw. typischen Konferenzen und dem Open Space als Unkonferenz.

Der Link, der euch direkt auf YouTube führt, findet ihr hier. Ich würde euch allerdings bitten beim Teilen den Blog Link zu verwenden.

NET Open Space – Interview mit Gregor Biswanger

In meinem Interview am .NET Open Space in Karlsruhe (#nossued) spreche ich mit Gregor, Inhaber von web-enliven, über seine favorisierten Sessions und den Vergleich zw. typischen Konferenzen und dem Open Space als Unkonferenz.

Der Link, der euch direkt auf YouTube führt, findet ihr hier. Ich würde euch allerdings bitten beim Teilen den Blog Link zu verwenden.

%d Bloggern gefällt das: