-
ACHTUNG - NEUES BLOG
Ab sofort steht unter http://devtyr.norberteder.com mein neues Blog zur Verfügung. Dieses Blog wird nicht weiter betreut, bleibt aber erhalten. Neue Eintr%auml;ge erfolgen nur mehr im neuen Blog. Kommentare werden ebenfalls nicht mehr behandelt. Wer weiterhin meinen Einträgen und Aktivitäten folgen möchte, möge bitte RSS-Feeds, Verlinkungen etc. an die neue Location anpassen.
|
DasBackup 1.0.7 verfügbar
30.03.07 - Tools, DasBackup Beitrag von Norbert Eder| | DasBackup 1.0.7 steht ab sofort zum Download bereit. In dieser Version wurden einige Anregungen verarbeitet, als auch viele Schönheitsfehler behoben. Zusätzlich wurden einige Usability-Probleme behoben.
Gänzlich neu ist die hinzugekommene Mehrsprachigkeit. Derzeit stehen die Sprachen Deutsch und Englisch (Standard) zur Verfügung.
Weitere Informationen sind auf der DasBackup Projektseite verfügbar.
Wer bezüglich Mehrsprachigkeit einen Beitrag leisten möchte kann die Sprachdateien im Unterverzeichnis languages finden. Es handelt sich hier um reine XML-Dateien, die einfach angepasst werden können. Neue Übersetzungen bitte ich mir zuzusenden. Vielen Dank.
| | | 4 Kommentare
- 1202 mal angesehen
| 0 Trackbacks
| Permalink | Trackback-URL |
Mitschnitt Livecast Globalisierung
30.03.07 - .NET, Allerlei Beitrag von Norbert Eder
Jobangebote in der IT - Eine Weiterentwicklung ist notwendig
26.03.07 - Entwicklung, Diskussionen Beitrag von Norbert Eder| | Im Beitrag Jobangebote vs Jobforderungen hatte ich bereits über den - aus meiner Sicht gesehenen - Missstand von Jobangeboten der IT-Branche berichtet. Nun, diese Gedanken wurden weiterentwickelt und mit konkreten Vorschlägen untermauert.
Bisheriger Stand
Wer sich per Zufall ein Jobangebot aussucht, der findet darin hauptsächlich Forderungen, jedoch nahezu keine Anreize, sich auch tatsächlich zu bewerben. Gesucht wird ein Allrounder, ein Wunderwuzzi.
Umdenken ist notwendig
Fakt ist, dass Unternehmen Mitarbeiter suchen. Diese müssen natürlich entsprechende Kenntnisse mitbringen um ihre Arbeit zuverlässig ausführen zu können. Sind dafür jedoch alle angegebenen Anforderungen notwendig? Durchleuchten wir doch einige dieser Punkte:
Hochschulabschluss
Ein akademischer Titel suggeriert Lernfähigkeit, Lernwille, Selbstdisziplin, Genauigkeit und noch vieles mehr. Ein abgeschlossenes Studium bedeutet jedoch nicht, dass alle diese EIgenschaften auch tatsächlich erfüllt werden. Auch wird durch den Studienplan festgelegt, welche Fähigkeiten der Absolvent besitzen sollte. Das erfolgreiche Ablegen der Diplomprüfung bedeutet in der Realität aber nicht, dass dem so ist.
In der Arbeitswelt tummeln sich jede Menge Nicht-Akademiker, die zwar möglicherweise kein so breitgefächertes (oberflächliches) Wissen besitzen wie Akademiker, dafür jedoch in vielen Fällen eine höhere fachliche Kompetenz aufweisen.
Durch die Notwendigkeit eines Hochschulabschlusses, wird jedoch von Beginn an den Nicht-Akademikern die Chance auf diesen Job genommen. Es gibt auf beiden Seiten gute, als auch schlechte potentielle Mitarbeiter. So sollte nicht die Anforderung nach einem Hochschulabschluss gegeben sein, sondern vielmehr, die tatsächlichen Anforderungen bzw. die mögliche Weiterentwicklung im Unternehmen. Dadurch kristallisiert sich sehr schnell heraus, ob nun doch ein akademischer Grad notwendig ist oder nicht. Besitzt jemand ohne akademischen Grad diese Fähigkeiten bekommt er jedoch die Möglichkeit, sich zu bewerben (bzw. wird seine Bewerbung ernst genommen).
Ausschlaggebend sollten dementsprechend die tatsächlichen Fähigkeiten sein und der Grad der Übereinstimmung zu den gemachten Anforderungen.
Ich will, ich will - Angaben der Anforderungen
Hier gilt nach der Größe des Unternehmens zu unterscheiden. Kleine Softwareschmieden vereinen mehrere Aufgabengebiete in einer Person. Hintergrund: Es kann sich nicht für jedes Aufgabengebiet einen eigenen Mitarbeiter (oder gar ein ganzes Team) leisten. Hier ist es unumgänglich, dass ein Softwareentwickler auch Datenbank-Administrator ist, oder sich ebenfalls mit Netzwerken auskennen muss. Diese Tatsache kann nicht umgangen werden, sollte jedoch in einem Jobprofil angegeben werden - nämlich als Hinweis zur Unternehmensgröße und des tatsächlichen Aufgabengebietes.
Bei größeren Unternehmen gestaltet sich dieser Punkt einfacher. Hier gibt es oftmals eigene Datenbank-Administratoren, Entwickler-Teams in unterschiedlichen Ausprägungen etc.
Nichts desto trotz sollten ganz klare Verhältnisse geschaffen werden. Es gilt sich zu überlegen, welche Anforderungen wirklich notwendig sind (keine utopischen Angaben) und welche optional für das Unternehmen hilfreich wären. Kaum wird es jemanden geben, der alle Anforderungen erfüllen kann, jedoch sollten diese klar (der Realität entsprechend) definiert werden.
Das wichtigste an dieser Stelle ist jedoch anzugeben, was der potentielle Mitarbeiter als Gegenleistung erhält. Natürlich steht das Gehalt im Vordergrund. Dieses ist - da ein bestimmter Betrag - klar bewertbar. Es stellt jedoch nur einen Teil der Gegenleistung dar. Was kann denn das Unternehmen noch bieten?
Vor allem Softwareentwicklern wird oft nachgesagt, dass sie meist nur über eine geringe soziale Ausprägung verfügen, introvertiert sind, nur in ihrer eigenen Gedankenwelt leben. Dies ist schon lange nicht mehr so. Für wenig Geld kann also jedes Unternehmen soziale Rahmenprogramme anbieten (gemeinsame Ausflüge, Sport, Besuch von Freizeit-Veranstaltungen). Welcher Entwickler freut sich beispielsweise nicht darüber, hin und wieder auf eine Fachmesse zu dürfen?
Diese Angebote sind zwar nicht leicht zu bewerten (da nicht Bestandteil des Gehaltes), sorgen aber für eine besondere Grundlage für eine gute Zusammenarbeit und genau das sollte es sein.
Sind allgemeine Angaben gute Angaben?
Besonders allgemein gehaltene Angaben können von einem potentiellen Bewerber nicht bewertet werden. Ein Beispiel:
Hervorragende C# Kenntnisse
Wie sind hervorragende Kenntnisse zu beurteilen? Kann man sich selbst als hervorragend einschätzen? Ja, kann man. Entspricht aber meist nicht den Tatsachen. Vielmehr bietet es sich an, klar zu beshreiben, was tatsächlich gewünscht wird. Anstatt der obigen Angabe könnte dies so formuliert werden:
C# (Reflection, Threading, Generics)
Und schon ist klar, was gewünscht wird. Ohne Missverständnisse. Genauso sollte dies bei allen angeführten Forderungen passieren. Nochmals zur Erinnerung: Nur Punkte definieren, die auch tatsächlich benötigt werden, keine utopischen Angaben.
| | | 8 Kommentare
- 1217 mal angesehen
| 0 Trackbacks
| Permalink | Trackback-URL |
Wieder im Lande!
23.03.07 - Blog-Intern Beitrag von Norbert Eder| | So, vorbei ist der erste Teil meines Urlaubs. Zwar nicht viel braungebrannter als vorher, aber daher um viele Eindrücke, Erfahrungen und Ideen reicher bin ich wieder da!
Weitere Informationen folgen, vorerst vom Flug erholen :)
| | | Kommentar hinzufügen
- 2 mal angesehen
| 0 Trackbacks
| Permalink | Trackback-URL |
Livecast Web Services: Mittschnitt verfügbar
15.03.07 - .NET, Allerlei Beitrag von Norbert Eder
RSS Bandit 1.5.10 verfügbar
13.03.07 - Tools, 3rd Party Tools Beitrag von Norbert Eder| | Wer so wie ich den RSS Bandit als News Aggregator verwendet, der wird sich über die neue Version 1.5.0.10 freuen.
Weitere Informationen: http://sourceforge.net/forum/forum.php?forum_id=671910
Was mir aber vorweg schon nicht gefällt ist die Platzeinteilung, da die neuen Steuerelemente wesentlich mehr Platz einnehmen als davor. Auffällt auf den zweiten Blick auch die Anzeige der Favicons, was aber vielmehr eine Spielerei denn nützlich ist.
Sonst gibt es noch ein paar nette Features, die unter dem obigen Link näher beschrieben werden.
| | | 2 Kommentare
- 1043 mal angesehen
| 0 Trackbacks
| Permalink | Trackback-URL |
Was ist Qualität?
12.03.07 - Entwicklung, Qualitätsmgmt. Beitrag von Norbert Eder| | Diese Frage ist wohl die essentiellste aller Fragen aus dem Qualitätsmanagement. Doch was ist wirklich Qualität? Kann Qualität gemessen werden, oder handelt es sich dabei nur um eine subjektive Sichtweise?
Einige meinen hier vermutlich, dass Qualität auf jeden Fall gemessen werden kann. Man nehme die Anzahl der Funktionen und setze sie in Verhältnis dazu, wieviele tatsächlich ordnungsgemäß ihren Dienst verrichten.
Andere mögen dieser Aussage widersprechen. Qualität bedeutet nicht, dass etwas so funktioniert wie es definiert wurde, sondern so, wie es sich der Anwender wünscht (kommt hier etwa das Thema Usability ins Spiel?). Zusätzlich zur angebotenen Funktionalität zählen auch Support, zusätzliche Dienstleistungen und vieles mehr zur Qualität.
Nun kommt die dritte Gruppe und erzählt, dass der Begriff der Qualität aus dem Altertum bekannt ist. Weiters wird im Lateinischen der Begriff qualitatis mit der Beschaffenheit (vermutlich eines Gegenstandes?) übersetzt. Weiters wird Qualität nicht nur durch Technik definiert, sondern auch durch eine geistige Haltung. So gesehen kann dies in einer Formel abgebildet werden:
Qualität = Technik + Geisteshaltung (Kamiske)
Durch einen vermehrten Einsatz von Technik kann die Qualität verbessert werden. Produkte werden nach demselben Ablauf produziert, manuelle Eingriffe sind oft nicht mehr notwendig und dadurch auftretende Fehler können ausgeschlossen werden. Ein möglicher Diskussionspunkt an dieser Stelle stellt sicherlich (als Beispiel) Bentley dar: Die Lederausstattung wird manuell eingepasst und "montiert". Dies wirkt dementsprechend der obigen Formel entgegen.
Die Geisteshaltung stellt jedoch einen sehr wichtigen Baustein zum Gebäude Qualität dar. Steckt kein hohes Maß an Qualitätsbewußtsein in den Köpfen der Mitarbeiter, ist es nahezu unmöglich, qualitativ hochwertige Produkte zu erzeugen. Mitarbeiter müssen diesen Gedanken tragen, sich dafür einsetzen und - wie auch das Management - entsprechende Verbesserungsvorschläge bringen und durchsetzen (siehe auch Total Quality Management - TQM).
Doch zurück zur Frage: Was ist wirklich Qualität? Qualität wird nicht durch ein Produkt oder ein Unternehmen definiert. Qualität beginnt bei der Zufriedenheit des Kunden und endet beim ersten Rümpfen der Nase. Dies ist klarerweise hart definiert, aber es entspricht in etwa der Erwartungshaltung des Kunden. Und nein! Das ist noch nicht alles: Support, Kommunikation mit dem Kunden, rasche Fehlerbehebung und vieles mehr füllt den Begriff Qualität aus. Es ist also gut zu "sehen", dass es immer und überall Möglichkeiten gibt, die gebotene Qualität zu erhöhen.
Auf den Punkt gebracht: Trotz aller Normen und Richtlinien: Qualität ist eine subjektive Sichtweise. Dieser kann jedoch durch eine effiziente und beharrliche Umsetzung nahegekommen werden.
| | | Kommentar hinzufügen
| 0 Trackbacks
| Permalink | Trackback-URL |
Einstellungen einfach speichern und laden
12.03.07 - .NET, Grundlagen, Base Framework Beitrag von Norbert Eder| | Wer beispielsweise viele unterschiedliche Konfigurationen speichern muss (oder auch andere Daten), dem wird es nicht allzu einfach gemacht. Zum einen bietet sich eine Datenbank an (zusammen mit einem O/R Mapper). Wer keine Datenbank verwenden möchte (aus unterschiedlichsten Gründen), der muss sich anders behelfen. Serialisierung ist eine Möglichkeit. Da ich nun genau diesen Fall hatte, schrieb ich mir einen kleinen Manager der diese Aufgabe für mich übernimmt.
Implementiert ist die Klasse als Singleton und kann mit allen serialisierbaren Typen umgehen:
/// <summary>
/// Read and write Configuration files. Uses the binary formatter.
/// </summary>
public class ConfigurationManager
{
#region Private Members
private static object _lockObject = new object();
private static ConfigurationManager _instance = null;
private string _configPath = null;
#endregion Private Members
#region Properties
/// <summary>
/// ConfigurationPath is used to store the configuration
/// </summary>
public string ConfigurationPath
{
get { return this._configPath; }
set { this._configPath = value; }
}
#endregion Properties
#region ctor
/// <summary>
/// Private Constructor -> Singleton
/// </summary>
private ConfigurationManager() {}
#endregion ctor
#region Public Methods
/// <summary>
/// Creates a new instance if there wasn't already
/// one created, else the available instance will be
/// returned
/// </summary>
/// <returns>ConfigurationManager instance</returns>
public static ConfigurationManager GetInstance()
{
lock (_lockObject)
{
if (_instance == null)
_instance = new ConfigurationManager();
return _instance;
}
}
/// <summary>
/// Read configuration. The typename is used as the filename
/// </summary>
/// <typeparam name="T">Any serializable type</typeparam>
/// <param name="configuration">Serializable object</param>
/// <returns>Given type T</returns>
public T Read<T>(T configuration)
{
return Read<T>(configuration.GetType().Name);
}
/// <summary>
/// Read configuration
/// </summary>
/// <typeparam name="T">Any serializable type</typeparam>
/// <param name="configuration">Serializable object</param>
/// <returns>Given type T</returns>
public T Read<T>(string configuration)
{
if (this._configPath == null
:: !Directory.Exists(this._configPath))
throw new Exception(
String.Format(
"ConfigurationManager: No valid path given: {0}",
this._configPath ?? "<not set>"));
string filename =
Path.Combine(this._configPath, configuration) + ".config";
if (!File.Exists(filename))
throw new Exception(
String.Format(
"ConfigurationManager: Configuration {0} doesn't exist",
filename));
BinaryFormatter bf = new BinaryFormatter();
FileStream fs = new FileStream(filename, FileMode.Open);
T tempObject = (T)bf.Deserialize(fs);
fs.Close();
return tempObject;
}
/// <summary>
/// Write Configuration. The typename is used as the filename
/// </summary>
/// <typeparam name="T">Any serializable type</typeparam>
/// <param name="configuration">Serializable object</param>
public void Write<T>(T configuration)
{
this.Write(configuration, configuration.GetType().Name);
}
/// <summary>
/// Write Configuration.
/// </summary>
/// <typeparam name="T">Any serializable type</typeparam>
/// <param name="configuration">Serializable object</param>
/// <param name="filename">Filename to be used</param>
public void Write<T>(T configuration, string filename)
{
if (this._configPath == null
:: !Directory.Exists(this._configPath))
throw new Exception(
String.Format(
"ConfigurationManager: No valid path given: {0}",
this._configPath ?? "<not set>"));
string file =
Path.Combine(this._configPath, filename) + ".config";
BinaryFormatter bf = new BinaryFormatter();
FileStream fs =
new FileStream(file, FileMode.OpenOrCreate);
bf.Serialize(fs, configuration);
fs.Close();
}
#endregion Public Methods
}
Wie kann dieser Manager nun eingesetzt werden? Zuerst muss ein serialisierbares Objekt erstellt werden:
[Serializable]
public class Package
{
public string PackagePath = null;
public ArrayList DirectoryList = new ArrayList();
public ArrayList FileTypeList = new ArrayList();
public ArrayList FilesList = new ArrayList();
}
Diese Klasse ist serialisierbar und kann nun mit dem ConfigurationManager verwendet werden. (Der Name ConfigurationManager wird von mir für das Speichern von Konfigurationen verwendet. Grundlegend können alle serialisierbaren Typen damit gespeichert bzw. geladen werden.)
Und so geschieht in weiterer Folge der Aufruf:
ConfigurationManager cm = ConfigurationManager.GetInstance();
cm.ConfigurationPath = "MyPath";
Package pcp = new Package();
pcp.PackagePath = "Another Path";
cm.Write(pcp, "MyFile.config");
Package originalPackage = cm.Read("MyFile.config");
Anzumerken ist, dass der Pfad des ConfigurationManagers nur einmal gesetzt werden muss, also nicht bei jedem Aufruf (ausser die Konfigurationen werden in unterschiedlichen Verzeichnissen abgelegt).
| | | 1 Kommentar
- 1379 mal angesehen
| 0 Trackbacks
| Permalink | Trackback-URL |
Unbehandelte Ausnahmen (Unhandled Exceptions)
11.03.07 - .NET, Grundlagen, Base Framework Beitrag von Norbert Eder| | Die Frage nach einer globalen Behandlung] von aufgetretenen Ausnahmen - und speziell von unbehandelten Ausnahmen) wird oft gestellt. Als mögliche Realisierung wird oft das folgende Bespiel gebracht (Ausgangspunkt ist hier eine Konsolenanwendung):
class Program
{
static void Main(string[] args)
{
AppDomain.CurrentDomain.UnhandledException +=
new UnhandledExceptionEventHandler
(delegate(object o, UnhandledExceptionEventArgs
eventArgs)
{
Console.WriteLine("Unhandled Exception: " +
eventArgs.ExceptionObject);
});
}
}
Verschwiegen (ob bewußt oder aus Nichtwissenheit) wird meist, dass über diesen Weg zwar viele Ausnahmen abgefangen werden können, diese Möglichkeit jedoch nicht als "Exception-Handler" zu verwenden ist.
Warum nicht? Vorerst werden hiermit nicht behandelnden Exceptions mitgeteilt. Würde es sich um einen Handler handeln, wären die Exceptions nicht unbehandelt. (Achtung: Rekursions-Alarm!)
Weiters lassen sich einige Exceptions hiermit nicht behandeln, da sie via try-catch nicht abgefangen werden können (seit .NET 2.0: StackOverflowException). Zusätzlich ist zu beachten, dass es einen groben Unterschied macht, ob manuell (zwecks Testvorgang) eine StackOverflowException geworfen wird, oder tatsächlich eine echte auftritt. Im ersteren Fall könnte die Exception behandelt werden, im zweiteren Fall wird die Anwendung sofort terminiert.
Zusätzlich sind derartige Verhaltensweise idealerweise in einem Release-Build zu testen, da es Unterschiede zu Debug-Builds gibt und für gewöhnlich Release-Builds ausgeliefert werden.
Das bedeutet: Die einzige sinnvolle Einsatzvariante liegt darin, den aktuellen Anwendungsstatus zu speichern bzw. die nicht behandelnden Exceptions in eine Logdatei aufzuzeichnen. Denn die Anwendung wandert ohnehin über den Jordan (sofern eventArgs.IsTerminating wahr ist) ...
| | | 7 Kommentare
- 1871 mal angesehen
| 0 Trackbacks
| Permalink | Trackback-URL |
Mitschnitt des Livecasts zum Thema Quality Assurance ist online
08.03.07 - Blog-Intern Beitrag von Norbert Eder Zurück Weiter
|
|
|
|
|
|
|