Archiv für den Monat Mai 2012

Clean Code Sample

In einem Gespräch mit unseren Webentwicklern habe ich den Kollegen einen Vorschlag für die Implementierung des Zugangs zu unserem Kundenportals unterbreitet: Unsere PHP Entwickler sind inzwischen ebenfalls auf den Ansatz des Testens umgestiegen, sodass sie ihre PHP und JavaScript Architektur anpassen müssen. Leider fehlt es an Frameworks, die einem ein Teil der Arbeit abnehmen könnten, wie z.B. Mocking Frameworks a la FakeItEasy. Falls jemand Frameworks kennt, dann melde er sich bitte bei mir.

Anforderungen (vereinfacht): An unserem Kundenportal ‘MyHeco’ soll man sich einloggen, ausloggen und das Password zurücksetzen können. Die Webanwendung konsumiert dabei .NET basierende Webservices!

Dies soll nun möglichst clean unter Einhaltung gängiger Prinzipien (wie z.B. dem Single Responsibility Principle) umgesetzt werden. Wie bereits erwähnt, muss die Architektur so gewählt werden, dass der Code einfach zu testen ist. Das ist v.a. auch deswegen nicht ganz trivial, weil Aufrufe nach ‘Außen’ zu Webservices gehen.

Hier also mein Vorschlag (natürlich in C# formuliert):

   1: interface IAuthenticateMyHecoUser

   2: {

   3:     MyHecoUser Login(string email, string password);

   4: }

   5:  

   6: interface ILogoutMyHecoUser

   7: {

   8:     void Logout(string session);

   9: }

  10:  

  11: interface IResetMyHecoPassword

  12: {

  13:     void ResetPassword(string email);

  14: }

Schreibe 3 Interfaces für die eigentlichen Aktionen, z.B. Login. Natürlich könnte dafür auch nur ein Interface geschrieben werden werden, allerdings empfinde ich es so als sauberer und die Interfaces lassen sich sprechend benennen (ohne Weasel Words, also Füllwörter; tollen Artikel dazu gibt es von Johannes).

Danach benötigen wir ein Interface für die Webservice-Kommunikation, welches ich an dieser Stelle leer lasse:

   1: public interface IERPCommunication

   2: {

   3:      

   4: }

Was ich ebenfalls zu den Kontrakten zähle (vergleicht dazu diesen Artikel), ist das DTO MyHecoUser, welches später die gefüllten Daten zum Austausch innerhalb von PHP enthalten soll.

   1: public class MyHecoUser

   2: {

   3:     public readonly int Kundennummer;

   4:     public readonly string Session;

   5:     //und diverse weitere

   6: }

Zu guter Letzt benötigen wir noch die Implementierung, die so aussehen könnte. Je nach Umfang und Größe des Codes, wäre es auch durchaus denkbar, die Implementierung auf verschiedene Klassen aufzusplitten. Aber in diesem Fall implementiert eine Klasse die 3 Interfaces aus dem Code Snippet ganz oben.

   1: public class MyHeco : IAuthenticateMyHecoUser, ILogoutMyHecoUser, IResetMyHecoPassword

   2: {

   3:     readonly IERPCommunication _webservice;

   4:  

   5:     public MyHeco(IERPCommunication webservice)

   6:     {

   7:         _webservice = webservice;

   8:     }

   9:  

  10:     public MyHecoUser Login(string email, string password)

  11:     {

  12:         throw new System.NotImplementedException();

  13:     }

  14:  

  15:     public void Logout(string session)

  16:     {

  17:         throw new System.NotImplementedException();

  18:     }

  19:  

  20:     public void ResetPassword(string email)

  21:     {

  22:         throw new System.NotImplementedException();

  23:     }

  24: }

 

Durch die Abstraktion der Webservice-Kommunikation hinter einem Interface und dem Injizieren im Konstruktor, können die Kollegen nun für den Test einen selbstgeschriebenen Fake hineinreichen. Ich validiere hier zugegebenermaßen den Parameter nicht, da ich in unserer Architektur auf IoC mit Castle.Windsor setze. Die Benennung spricht mich persönlich auch an, da sie sehr aussagekräftig ist:

MyHeco.Login oder Myheco.Logout sind eindeutig. Die Kohäsion scheint mir ebenfalls recht hoch, da die 3 möglichen von der Fachabteilung definierten MyHeco Aktionen in einer Klasse gekapselt sind. Trotzdem wäre eine spätere Auftrennung sehr einfach, da in der konsumierenden Klasse nur das konkrete Interface reingegeben wird. Beispiel: In einer Bestellung muss sich der Kunde erst einloggen. Also bekommt die Logik für eine Bestellung im Konstruktor ein IAuthenticateMyHecoUser reingereicht. Ist in Zukunft die Implementierung nicht mehr in der Klasse MyHeco, ändert sich die Logik der Bestellung in keiner Weise.

Interne Service Qualität

In einem Webcast berichte ich über die interne Service Qualität, d.h. wie wir als Dienstleister von den Kollegen der anderen Abteilungen bewertet wurden. Außerdem gebe ich Tipps zu Umfragen allgemein, Risk Management und vielem mehr.

 

Und immer schön auf “Mag ich” klicken Zwinkerndes Smiley

Das EM-Special

Kurz und knackig gibt es hier wichtige EM 2012-Specials, weil ich doch immer wieder aus dem privaten Bekanntenkreis gefragt werde, was ich empfehlen kann:

Spielpläne:

  • Sehr übersichtlicher Spielplan auf einer Din A4-Seite
  • Ebenfalls nicht schlecht, ist diese Exceldatei hier

Tippspiele:

Ich habe mir beide Tippspiele nur kurz angeschaut, sodass ich keine Empfehlung geben kann. Aus der Beschreibung zum ersten Link geht jedoch hervor, dass dort die Daten automatisch aus dem Internet abgerufen werden können, sodass ihr keine Ergebnisse pflegen müsst:

Außerdem für alle, die ein auf SharePoint basierendes Intranet haben, gibt es hier ein kostenloses Webpart. Aktuell hat die Software noch mit deutschsprachigen SharePoint Versionen Probleme, aber ich stehe gerade im Gespräch mit dem Entwickler und das dürfte vermutlich bis zum Beginn der EM behoben sein.

Outlook:

  • Einen EM Planer, der euch alle (oder nur bestimmte) Spiele direkt als Termin in Outlook einträgt, gibt es hier

Lizenz: Eine Kostenlose Registrierung ist notwendig. Wer mich gut kennt, kann mich auch in Facebook danach fragen…

 

Sonstiges/Weiterführendes:

  • Eine Übersicht von weiteren 30 Top Downloads gibt es hier
  • Ein PC Programm für Samsung Fernseher zum Sortieren der Kanäle könnt ihr hier herunterladen
  • YouTube Blockaden umgehen, falls mal ein brandaktuelles EM-Video-Highlight nicht laufen sollte (ein Link für Firefox findet ihr im Fazit des Artikels weiter unten)
  • Sportsbar-Finder: Zeigt die nächste Kneipe mit Pay TV-Anschluss
  • Liste großer Public Viewing Veranstaltungsorte
  • Deutsche Nationalhymne, wer sie denn immer noch nicht können sollte

 

Gerne darf man mir und den verlinkten Seiten einen netten Kommentar hinterlassen. Vor allem chip online!

Kooperation mit Schulen

Der Fachkräftemangel ist längst in allen Betrieben angekommen. Die Politik steht vor einer großen Herausforderung den Bedarf auf absehbare Zeit zu decken. Selbstverständlich spüre gerade auch ich als CIO in einem mittelständischen Betrieb das Problem, denn der deutsche Mittelstand ist davon ganz besonders betroffen, wie ein jüngst veröffentlichter Artikel zeigt.

Nachdem ich in den vergangen Jahren gute Erfahrungen mit Praktikanten (von denen wir inzwischen auch einen in eine Festanstellung übernommen haben) aus dem Berufsförderungswerk Schömberg gemacht habe (und noch immer mache!), soll nun ein weiterer Schritt folgen: Eine Kooperation mit Gymnasien.

 

“Was du nicht selbst tust, tut kein anderer für dich.” – Felix Lope de Vega Carpio

 

Der Gedanke kam mir, als ich kürzlich wieder Kontakt mit einem ehemaligen Ferienjobber hatte, welcher bereits in der 10ten Klasse zu uns kam und somit 3 Jahre zur Verfügung stand. Seine Leistung war über alle Maßen hervorragend und gerne hätten wir ihm ein Duales Studium an der DHBW angeboten, allerdings hat er sich – für mich als IT-ler völlig unverständlich – für ein Medizinstudium entschieden.

Als ich nun kürzlich eine Bogy Bewerbung bei mir einging, wollte ich die Gelegenheit nutzen. Ich sprach mit dem Bewerber über die Situation an seiner Schule: Wird eine Informatik AG angeboten, fand bereits ein für die gesamte Klasse verpflichtender EDV-Kurs statt, etc.. Da es sich um ein vergleichsweise kleines Gymnasium handelt, waren die Angebote sehr bescheiden. Sprechen wir nicht lange drum herum: Sie fehlten völlig! Interessant war aber, dass der Bewerber auf die Frage, ob er denn an einem Ferienjob in der IT im Sommer Interesse hätte, mit einem euphorischen ‘Ja’ antwortete. Um dem Ganzen die Krone aufzusetzen: Der Bewerber ist aus dem gleichen Ort wie unser Stammsitz. Daran sieht man, dass es durchaus potentielle Fachkräfte selbst in kleineren Orten, quasi auf dem Land, geben könnte – Betonung auf könnte!

Deshalb werde ich in den kommenden Wochen die Gymnasien im Umkreis Remchingens kontaktieren und Gespräche mit den verantwortlichen Stellen führen. Primär hoffe ich natürlich auf Kontakte zu IT-affinen Lehrern und aufgeschlossenen Direktoren, welche bereits IT AGs anbieten.

So wäre es denkbar, dass unsere Entwickler, Administratoren und Webdesigner das jeweilige Berufsbild zunächst einmal vermitteln. Dazu würde ich auch bei meinem privaten IT Netzwerk anklopfen, ob es Freiwillige gibt, die sich ebenfalls zur Verfügung stellen. Darüber hinaus würde ich mit den Lehrern praxisrelevante Aufgaben erstellen, konkrete Fallbeispiele mit beriebswissenschaftlichem Hintergrund diskutieren, Coding Dojos abhalten, UserGroup Besuche organisieren, u.v.m.. Natürlich würden wir auch gerne jungen Talent einen Ferienjob anbieten. Ein ambitionierterer Schritt wäre vielleicht die Einführung einer IT AG.

Wenn also Verantwortliche aus Schulen oder etwaige Unterstützer aus Betrieben auf diesen Blogeintrag aufmerksam geworden sind, dann darf man mich gerne unter uli.armbruster [at] heco.de kontaktieren. Ich freue mich sagen zu dürfen, dass die Firma heco voll und ganz hinter dieser Initiative steht!

Eine weitere kurze Anmerkung: Bereits letztes Jahr habe ich der DHBW Karlsruhe angeboten einen praxisrelevanten Vortrag über Unit Testing und saubere Softwarearchitektur zu halten. Leider blieben zwei Emailversuche gänzlich unbeantwortet. Wenn dies also ein Dozent liest, darf er mich auch gerne ansprechen.

Arithmetische Operationen – Das wichtige Schlüsselwort checked

 

Was steht nach der Ausführung von Zeile 2 in der Variablen ‘input’?

   1: var number1 = int.MaxValue;

   2: var input =  number1 + 10;

Nein, die Antwort lautet nicht, dass eine Exception geschmissen wird und nein, es ist auch nicht int.MaxValue.

Das Ergebnis ist int.MinValue + 9

image

Und wie müsste der Code geändert werden, damit die Operation eine StackOverflowException schmeißt? Die Lösung ist trivial, allerdings kennen die meisten das Schlüsselwort checked nicht. Deshalb sei an dieser Stelle auf darauf verwiesen.

Noch ein weiterer Hinweis:

   1: var zero = 0;

   2: Console.WriteLine(1d / zero);

   3: Console.WriteLine(1 / zero);

Während Zeile 2 als Ergebnis unendlich liefert, erfolgt in Zeile 3 eine Exception.

VB6 und RemoteApp – Darstellungsfehler

Unser ERP-System, welches zum Teil aus VB6 Oberflächen (sprich VB6 Formulare mit VB6 Controls), zum Teil aus .NET Oberflächen besteht, hat Darstellungsprobleme, wenn es als RemoteApp ausgeführt wird. Als Client Anwendung oder als normale TSE Anwendung (sprich man arbeitet in der Remotedesktop-Console) gibt es keinerlei Probleme. Sobald die Anwendung als RemoteApp läuft, werden die VB6 Oberflächen sporadisch nicht korrekt dargestellt, z.B. wenn zuvor eine andere Oberfläche darüber lag und diese geschlossen wird. Anscheinend kriegt VB6 nicht mit, dass es das Fenster bzw. die Controls refreshen muss.

image

image

Hat irgendjemand noch dieses Problem oder hat eine Idee wie man das lösen könnte. Zum besseren Verständnis habe ich einen Screencast hochgeladen, der die Problematik zeigt:

Integration eines SharePoint Wikis ins ERP-System

Seit ca. 3 Monaten setzen wir erfolgreich auf die Kollaborationsmöglichkeiten, die ein Wiki-System bietet. Als Basis verwenden wir dazu die SharePoint Foundation, welche kostenlos für Windows Server zur Verfügung steht. In dem folgenden Video zeige ich, worauf es zu achten gilt und wie die Firma heco den Wiki Inhalt erfolgreich in das hauseigene ERP-System integriert hat.

In dem Video war leider keine Zeit mehr, um auf weitere Ideen einzugehen und weiterführende Quellen zu nennen, deshalb hole ich dies hiermit nach:

  • Geplant ist eine Ausweitung um Multimediainhalte, allerdings nicht nur aus SharePoint selbst, sondern auch von YouTube
  • Das Aufrufen von ERP-Funktionalität aus dem Wiki
  • Ein Webpart, welches automatisch die Daten des für den Inhalt zuständigen Sachbearbeiters lädt und anzeigt, z.B. die Telefonnummer

Für Rückfragen stehe ich gerne über die üblichen Kommunikationskanäle zur Verfügung. Aber auch wir haben noch Fragen: Kann mir jemand sagen, wo ich das Template für eine Wiki Seite anpassen kann, um z.B. auf allen Seiten immer den letzten Bearbeiter anzuzeigen oder um diverse Links immer am unteren Rand einzublenden?

 

Weiterführende Links:

%d Bloggern gefällt das: