Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von LaTino
Thema: Ticken Web Entwickler anders als Desktop Entwickler?
Am im Forum: Web-Technologien

Dir ist schon klar, dass die Frage das Potenzial hat, mitlesende Web- und Desktopentwickler mit Messern zwischen den Zähnen aufeinander losgehen zu lassen, ja?

1. Webentwickler beherrschen tendenziell mehr Technologien als Desktopentwickler, einfach, weil sie sie benötigen.

2. Quereinsteiger steigen eher in der Webentwicklung ein. Das mag ein Grund sein, wieso man dort (gefühlt) häufiger ein komplett chaotisches Durcheinander anstelle von strukturiertem Arbeiten antrifft. Wie du sagst, fühlt man sich zeitweise in seine Anfangszeit versetzt. Aber:

3. Du tust professionellen Webentwicklern ziemlich unrecht, wenn du glaubst, dass dieses Gefrickle in der Webenticklwung liegende Ursachen hat. Nee, das liegt an den Leuten, nicht daran, was sie tun. Wenn man das scheue Tier "full-stack developer" sucht, dann sollte man bei guten Webentwicklern zuerst suchen, da hat man noch die besten Chancen.

Aber auch hier gilt: frag zwei Entwickler und du kriegst drei Antworten.

TypeScript würde ich dir auf jeden Fall empfehlen.

LaTino
EDIT: oh, und eins noch: jeder Entwickler ist Künstler, bzw. Kunsthandwerker. Das wäre nach meiner Meinung der Unterschied zwischen Softwareentwickler und Programmierer.

Thema: ASP.NET Core 2.0 nur noch mit .NET Core, nicht mehr mit .NET Framework (=>MS rudert zurück)
Am im Forum: Szenenews

Evaluieren gerade, was das für uns bedeutet. Sieht derzeit so aus, als ob damit quasi alle bisherigen .net-core-Projekte nicht mehr updatefähig sind[1] und damit bis zum Ende des Supports von net core 1.1 - 12 Monate nach Erscheinen von .net core 2.0 im Herbst, also in anderthalb Jahren - ersetzt werden müssen. Damit sind wir zwei Kollegen, die wir uns für netcore stark gemacht haben, quasi auf verlorenem Posten und können einpacken. .net core dürfte die nächsten Jahre hier kein Thema mehr sein. Damit, dass die Unkenrufe der Skeptiker sich bewahrheiten und wir beide aussehen wie Dorfdeppen, könnte ich noch leben, aber die Art und Weise ist schon sehr ärgerlich.

LaTino, deprimiert
[1] haben massive Abhängigkeiten auf System.Drawing sowie etliche Drittbibliotheken, für die keine Migration in Sicht ist

Thema: Zufalls Byte[,] Array (.NextBytes(b)) liefert immer Nullen
Am im Forum: Grundlagen von C#

Zitat von Abt
.. ob das nun für einen Anfänger "besser" verständlich ist als 5 Zeilen mehr Code... ich weiß ja nicht ;-)

Naja, das einzig unverständliche ist die letzte Zeile, und die war ja im ersten Beispiel nicht drin (dort hätte sie genauso ausgesehen, wenn man Linq benutzt). Der Punkt, den ich mit "besser" meinte, ist der Verzicht auf mehrdimensionale Arrays. C# unterstützt die Arbeit damit eher halbherzig, und genau wie in C(++) ist man in jedem Fall meistens besser dran, stattdessen mit flachen Arrays zu arbeiten und sich das bisschen Mehrarbeit mit dem Indexing zu machen. Grad als Anfänger übrigens. Man müsste mal schaun, wie oft Anfänger hier im Forum beim Arbeiten mit n-Arrays oder jagged Arrays in Schwierigkeiten geraten, gefühlt ist das jedenfalls ziemlich oft :).

Langer Rede kurzer Sinn: @TE, wenn es geht, lass array[,] oder array[][] weg. Und meistens geht es.

LaTino

Thema: Zufalls Byte[,] Array (.NextBytes(b)) liefert immer Nullen
Am im Forum: Grundlagen von C#

Zitat von Kleinstein11
Das hat mir weiter geholfen, es klappt. vielen Dank!!!

Sehr schön, dann hier die bessere Variante ;).


const int width = 64;
const int height = 240;

var flatArray = new byte[width * height];
random.NextBytes(flatArray); //<- exakt doppelt so schnell wie die Einzelbefüllung eines 2n-Arrays
var query = flatArray.Select((p, i) => new Tuple<int, int, byte>(i / height, i % height, p)).ToList();

LaTino

Thema: Zufalls Byte[,] Array (.NextBytes(b)) liefert immer Nullen
Am im Forum: Grundlagen von C#

byte[,] ist ein echtes zweidimensionales Array. Das ist ein völlig anderer Typ als ein eindimensionales Array. Die Methode NextBytes der Klasse Random erwartet als Parameter ein eindimensionales Array. Daher kannst du sie nicht benutzen.

Ich lass das Folgende mal unkommentiert stehen, mit ein wenig Eigeninitiative sollte dir das helfen.


static class Extensions
{
    public static void NextBytes(this Random random, byte[,] array)
    {
        for (int i = 0; i < array.GetLength(0); i++)
        for (int j = 0; j < array.GetLength(1); j++)
        {
            array[i, j] = (byte) random.Next(0, byte.MaxValue + 1);
        }
    }
}

Schau dir auch mal die Methode GetLength(n) des zweidimensionalen Arrays an und vergleiche sie mit der Eigenschaft Length.

LaTino

Thema: XML Datenexport aus eigener Daten Klasse
Am im Forum: Datentechnologien

Zuerst mal: mir rollen sich die Fußnägel hoch, wenn ich deine Klasse sehe. Wenn ein Bewerber sowas machen würde, wäre das Gespräch direkt beendet.

Zweitens: dass du nichts gefunden hast, finde ich schon sehr merkwürdig. Das Thema ist hier im Forum und auch sonst überall recht prominent.


static void Main()
{
    var serializer = new XmlSerializer(typeof(DatablockCollection));

    using (var file = File.OpenWrite("example.xml"))
    using (var writer = XmlWriter.Create(file))
        serializer.Serialize(writer, new DatablockCollection(new [] { new Datablock(), new Datablock(), new Datablock()  }));
}

public class DatablockCollection
{
    public DatablockCollection() { }
    public DatablockCollection(Datablock[] items) => Items = items;

    public Datablock[] Items { get; set; }
}

public class Datablock
{
    private const string DEFAULT_PATH = @"d:\bin";

    [XmlElement]
    public string Path { get; set; } = DEFAULT_PATH;
    [XmlElement]
    public string Name { get; set; }
    [XmlElement]
    public string LanMode { get; set; }
    [XmlElement]
    public bool Note { get; set; }
    [XmlElement]
    public string Id { get; set; }
    [XmlElement]
    public byte[] UsbRemap { get; set; } = {0x21, 0x43, 0x05};
    [XmlElement]
    public byte[] UsbConfig { get; set; } = {0x9b, 0x18, 0x00};
}

Tu dir aber bitte einen Gefallen und geh noch einmal zurück zu den Grundlagen.

LaTino

Thema: Auf Methoden von unbekannten Objekte durch Interface zugreifen
Am im Forum: Grundlagen von C#

Zuerst einmal ist eine abstrakte Klasse kein Interface. Das mag wie Haarspalterei erscheinen, aber die Konzepte "abstrakte Superklasse" und "Interface" sollte man sauber auseinanderhalten. Schon allein, weil es da sprachlich ansonsten Missverständnisse gibt.

Zum zweiten: deine Zell-Liste ist vom Typ List<CommonCell>?

Dann:


foreach(CommonCell cell in Cells)
{
    cell.Methode(); //<- Wikipedia: Polymorphie lesen & verstehen.
}

LaTino

Thema: [Gelöst] Visual Studio 2017: freeze beim Laden eines Projekts
Am im Forum: Entwicklungs- und Laufzeitumgebung (Infrastruktur)

Murphy. Der nächste Versuch hat das Problem gelöst.

Für die Nachwelt: VS starten, KEIN Projekt laden.
- Resharper Options-> Tools -> Unit Testing
- Haken bei "Save and Restore Unit Test Sessions" entfernen

Wenn ich raten sollte, würde ich sagen, die letzte Session wurde beim Beenden fehlerhaft gespeichert, so dass er sich beim Laden dann festgefressen hat.

Problem erledigt.

LaTino

Thema: [Gelöst] Visual Studio 2017: freeze beim Laden eines Projekts
Am im Forum: Entwicklungs- und Laufzeitumgebung (Infrastruktur)

Ohne etwas geändert zu haben (ich schwörs!), startet mein VS2017 Pro heute morgen nicht mehr. D.h. genauer gesagt startet es noch, friert aber ein, sobald ein Projekt (irgendeins) geladen wird. Letztes Lebenszeichen ist "Continous Testing is initializing...". Ich verdächtige Resharper (Ultimate, 2017.1). Kennt jemand das Problem und weiß eventuell auch eine Lösung? Im Notfall lebe ich auch mit einem Workaround ;).

Grüße,

LaTino

Thema: ASP.NET Core Middleware für REST Links
Am im Forum: Web-Technologien

Zitat von Abt
Eine Middleware hat immer einen Zweck der Manipulation eines Requests in der Pipeline. Hier ja gar nicht notwendig.

Erm, eigentlich manipuliert die Middleware Requests UND Responses in der Application pipeline. Insofern wäre es ohne weiteres machbar, die Antworten um zusätzliche Informationen anzureichern, und natürlich wird das auch gemacht. Der Punkt ist eher der: um HATEOAS zu implementieren, benötigt man Informationen zum Status der Applikation, die die Middleware nicht hat und auch nicht haben sollte. Wer den Status kennen muss, ist/sind der/die Controller, und aus diesem Grund passiert die Informationsanreicherung eben dort und nicht in der Middleware[1].

Grob fahrlässig verallgemeinert:
Middleware: Form der Anfragen prüfen, Form der Antworten manipulieren
EDIT: Action im [/EDIT]Controller: Inhalt der Anfragen prüfen, Inhalt der Antworten festlegen

Bei uns sieht so eine Anreicherung im Normalfall so aus:


public IActionResult Get(int id)
{
    var resultObject = DoSomething(id);
    return ResultResponse(resultObject).WithResultLink(uri);
}
//ResultResponse() ist analog zu OK() implementiert, liefert aber eine von IActionResult abgeleitete Schnittstelle, auf die die Extension WithResultLink manipulierend zugreifen kann, um den Inhalt anzureichern. Bezeichner sind im realen Leben natürlich anders.

LaTino
[1] habt ihr ja auch nicht anders behauptet, nur kam die Begründung nicht so recht rüber, meine ich.

EDIT: Abt hat natürlich recht, die Action ist, wo die, erm, Action ist. Ergänzt.

Thema: Alle strings in einem List<string> auf Teilweise gleichen Inhalt überprüfen
Am im Forum: Rund um die Programmierung

Zitat von Sir Rufo
Das Vergleichen der Strings bringt leider nicht das (wirkliche) gewünschte Ergebnis, denn es sind eben nicht einfach nur schnöde Strings, sondern Datei-Pfade und darum muss man diese auch wie solche behandeln.

Hier wird auch wieder ein klassischer Fehler beim Erstellen des Vorher-/Nachher-Beispiels gemacht:

Der simpelste Fall wird gezeigt anstatt der mit der höchstmöglichen Komplikation.

Ich denke, hier kann man ruhig mal die Kirche im Dorf lassen und davon ausgehen, dass er einfach nur ein paar Pfade unter Windows behandeln will. Strenggenommen hast du zwar Recht, aber für das Problem des TE sind die Hinweise eher irre- als zielführend.

EDIT: den Anforderungen kannst du also hinzufügen:
a) die Pfade sind Windows-Pfadangaben
b) jeder Pfad kommt nur einmal vor, Groß- und Kleinschreibung ist unbeachtlich
c) es gibt immer genau einen Eintrag, der der kürzeste ist und als Ergebnis übrig bleiben soll

LaTino

Thema: Alle strings in einem List<string> auf Teilweise gleichen Inhalt überprüfen
Am im Forum: Rund um die Programmierung

Geht mir ähnlich, aber ich rate mal wild: du möchtest die Zeichenketten vergleichen und den Teil, beginnend am Anfang der Zeichenketten, extrahieren, bis zu dem alle identisch sind. Ja?


string [] example = new[] 
{ 
    "auf der mauer auf der lauer", 
    "auf der mauer auf der", 
    "auf der mauer auf", 
    "auf der mauer", 
    "auf der", 
    "auf dem" 
};

string result = DoSomeMagic(example);
//result == "auf "

Lösung:

finde den kürzesten string im array
zaehle rückwärts von der länge des kürzesten strings bis 0 und:
    - extrahiere die Buchstaben von 0 bis zum Zähler aus dem kürzesten String
    - teste alle anderen strings, ob sie mit der extrahierten zeichenkette beginnen
    - wenn nein, zähle weiter rückwärts
    - wenn ja: ergebnis ist die extrahierte Zeichenkette


Viel Spass.

LaTino
EDIT: wenn es sich um Dateipfade handelt, geht das ganze auch schneller, weil man nicht alle Zeichen, sondern nur die Pfade extrahieren muss. Die statische Klasse Path in System.IO hat dafür passende Methoden.

Thema: Eignet sich das Galileo Openbook Visual C# um C# zu lernen?
Am im Forum: Buchempfehlungen

Zum einen: frag zwei Entwickler, ob Buch XY empfehlenswert ist, und du kriegst drei Meinungen.
Zum anderen: "Referenzen, die nicht hinterfragt werden müssen" - so etwas existiert in diesem Universum nicht, auch nicht auf mycsharp.de.

Was der Anfänger für gut hält, weil er einiges versteht (oder zu verstehen glaubt), und was erfahrene Entwickler für geeignet halten, sind auch noch zwei paar Schuhe. Schnelle Erfolgserlebnisse sollten jedoch kein Kriterium sein, wenn dafür die vermittelten Inhalte leiden.

Empfiehl das, was du gut findest. Ganz einfach :).

LaTino

Thema: Einstieg in Webprogrammierung: ASP.NET MVC oder Webforms?
Am im Forum: Web-Technologien

Ah, Mist, Quelle vergessen, und die ist hier sehr wichtig: das Zitat ist von 2014, upcoming bezieht sich auf 4.61.

Quelle

Sorry :o)

LaTino

Thema: Einstieg in Webprogrammierung: ASP.NET MVC oder Webforms?
Am im Forum: Web-Technologien

Microsoft hat's nicht so mit dem offiziellen Abkündigen von Features, man erinnere sich an das Hickhack mit Silverlight, wo es auch ewig kein offizielles Statement gab (gibt's eigentlich inzwischen eins?)

Das hier ist das letzt halbwegs offizielle Statement zum Thema, das ich finden konnte. Eine Abkündigung sieht anders aus, aber sind wir ehrlich: de facto ist WebForms tot.

Zitat von MSDN blog
Web Forms isn’t available on ASP.NET 5, but is still fully supported on the .NET Framework. There are a number of important new features coming to Web Forms in the upcoming version of the .NET Framework, including support for HTTP 2.0, async model binding and a Roslyn-based CodeDom provider. We’re also working on various features reminiscent of Web Forms in MVC 6, such as tag helpers and other Razor improvements.

AFAIK kamen die letzten WebForms-Entwicklungen mit .NET 4.61, aber da könnte ich mich irren.

LaTino

Thema: JSON in C# Klasse serialisieren schlägt fehl
Am im Forum: Web-Technologien

Für die Zukunft: die C#-Klasse von Hand schreiben ist keine gute Variante.

a) langsam
b) fehlerbehaftet

Nimm die Zeichenkette, die dir geliefert wird, kopier sie, mach im Visual Studio Bearbeiten->Inhalte Einfügen -> JSON als Klassen einfügen.

Ergibt für deinen Anwendungsfall:


public class Rootobject
{
    public Class1[] Property1 { get; set; }
}

public class Class1
{
    public string email { get; set; }
    public string firstname { get; set; }
    public string lastname { get; set; }
    public string id { get; set; }
    public string position { get; set; }
    public string height { get; set; }
    public string birthday { get; set; }
    public string strongFoot { get; set; }
}

Klasse Rootobject wirfst du weg, Class1 refaktorierst du, indem du die Typen nach Wunsch änderst und ggf Hinweise an den Serializer per Attribut "JsonProperty" gibst:


public class Kicker
{
    public string Email { get; set; }
    public string Firstname { get; set; }
    public string Lastname { get; set; }
    [JsonProperty("id")]
    public int KickerId { get; set; }
    public string Position { get; set; }
    public int Height { get; set; }
    public DateTime Birthday { get; set; }
    public string StrongFoot { get; set; }
}

Test schreiben:


[TestClass]
public class KickerTests
{
    [TestMethod]
    public void DeserializeKickerTest()
    {
        string input = @"[{""email"":""mail@dlrg-kickers.de"",""firstname"":""Max"",""lastname"":""Mustermann"",""id"":""1"",""position"":""Sturm"",""height"":""181"",""birthday"":""2012-12-11"",""strongFoot"":""rechts""}]";

        var expectedResult = new Kicker
        {
            Email = "mail@dlrg-kickers.de",
            Firstname = "Max",
            Lastname = "Mustermann",
            KickerId = 1,
            Position = "Sturm",
            Height = 181,
            Birthday = new DateTime(2012, 12, 11),
            StrongFoot = "rechts"
        };

        var actualResultList = JsonConvert.DeserializeObject<Kicker[]>(input);
        Assert.AreEqual(1, actualResultList.Length);

        var actualResult = actualResultList[0];
        Assert.AreEqual(expectedResult.Email, actualResult.Email);
        Assert.AreEqual(expectedResult.Firstname, actualResult.Firstname);
        Assert.AreEqual(expectedResult.Lastname, actualResult.Lastname);
        Assert.AreEqual(expectedResult.KickerId, actualResult.KickerId);
        Assert.AreEqual(expectedResult.Position, actualResult.Position);
        Assert.AreEqual(expectedResult.Height, actualResult.Height);
        Assert.AreEqual(expectedResult.Birthday, actualResult.Birthday);
        Assert.AreEqual(expectedResult.StrongFoot, actualResult.StrongFoot);
    }
}

Aufwand: ~3-5 Minuten pro Klasse maximal. Und bitte, keine App ohne UnitTestprojekt.

LaTino

Thema: Deserialize aus Memorystream wirft Fehler wegen nicht erreichtem Datenstromende
Am im Forum: Netzwerktechnologien

Zitat von pinki
Bei einem Fehler hätte ich eher auf die Stelle mit Convert.FromBase64String(value) getippt, da dann noch nicht genug Daten aus dem Stream gelesen worden wären.

Genau die Stelle, die mir seltsam vorkam. Das[EDIT]Base64-Codierung[/EDIT] sollte zum Versenden eigentlich nicht nötig sein.

LaTino

Thema: Deserialize aus Memorystream wirft Fehler wegen nicht erreichtem Datenstromende
Am im Forum: Netzwerktechnologien

Zeig mal den Code der Gegenseite. Kommt mir bisschen spanisch vor, was du da machst :)

LaTino

Thema: Lesenswerter Artikel: Hype Driven Development
Am im Forum: Smalltalk

Zitat von T-Virus
@MrSparkle
Hatte ich auch über FeFe gefunden :)
Ich auch ;).

Wieso hast du das Gefühl, wir würden Differenzen klären? Ist 'ne normale Diskussion, und die gehört mMn ins Forum. Es darf sich gern beteiligt werden. Sollten wir auf das Niveau "deine Mudder!" sinken, dann per PM, versprochen.

LaTino

Thema: UML, Pflichtenheft, Feinspezifikationen vs. agile Methoden
Am im Forum: Smalltalk

Moment, du sagst quasi, agile ist in Ordnung, aber wenn es kritisch wird, würdest du dann doch lieber drauf verzichten? (Davon abgesehen: haltet doch bitte die "Expertenkommissionen" nicht für dämlich. Da sitzen meist richtige Füchse mit drin, und schlaue Leute wissen, wenn sie etwas nicht wissen, und wie sie diese Lücken füllen. Darüber hinaus gibt es normierte, standardisierte, erprobte Vorgehensweisen, um Anforderungen korrekt erfassen zu können. Die Entwicklung dort ist ja nicht in den Achtzigern stehengeblieben.)

Und, äh, wenn der Auftraggeber zufrieden ist, heisst das nichts? Kann ich bitte ein Beispiel haben, wo ein Projekt gescheitert ist, obwohl der Kunde mit dem Ergebnis zufrieden war?

(Vermutlich verstehe ich nicht das, was du ausdrücken wolltest, also bitte kurz erläutern :) )

LaTino

Thema: Combobox Valuemember mit zusammengefügtem Displaymember ist "null" beim Abrufen
Am im Forum: GUI: Windows-Forms

Sehr, sehr rudimentäre Variante:


const char SPLIT_CHAR = ';';

var mcbList = File.ReadLines(@"mc.txt", Encoding.Default)
    .Select(p => p.Split(SPLIT_CHAR))
    .Where(p => p.Length == 2)
    .Select(Mcb.Create)
    .ToList();

var bindingSourceMc = new BindingSource {DataSource = mcbList};
comboBox1.DataSource = bindingSourceMc.DataSource;
comboBox1.ValueMember = "Ort";
comboBox1.DisplayMember = "FullName";

comboBox1.LostFocus += (sender, args) => //nicht das beste Event dafür, aber ist ja nur Demo :)
{
    var cb = sender as ComboBox;
    if(cb == null) return;
    if (cb.SelectedItem == null)
    {
        var newItem = Mcb.Create(cb.Text.Split(' '));

        bindingSourceMc.Add(newItem);
        comboBox1.DataSource = bindingSourceMc;
        comboBox1.SelectedItem = newItem;
    }

    MessageBox.Show(cb.SelectedValue.ToString(), @"Debug ;)");
};

//Bequemlichkeitsänderungen an MCB
public class Mcb
{
    private Mcb() { }
    private string Name2 { get; set; }
    public string Ort { get; private set; }
    public string FullName => $"{Ort} {Name2}";

    public static Mcb Create(string[] init)
    {
        return new Mcb
        {
            Ort = init[0],
            Name2 = init[1]
        };
    }
}

EDIT: Schönheitskorrektur

Thema: Combobox Valuemember mit zusammengefügtem Displaymember ist "null" beim Abrufen
Am im Forum: GUI: Windows-Forms

Dein Problem ist dein Databinding. Wenn in die CB ein neuer Wert eingetragen wird, musst du:

a) eine neue Instanz der Klasse MCB erstellen
b) sie der DataSource hinzufügen
c) evtl neu binden

WinForms weiß, dass es an Objekte vom Typ "MCB" gebunden ist, dass SelectedValue die Eigenschaft "Ort" des gebundenen Elements ist, und dass die Eigenschaft "FullName" des gebundenen Elements benutzt wird, um den Text darzustellen. Deshalb geht MrSparkles Anmerkung in die falsche Richtung, die Ort-Eigenschaft muss nicht eindeutig sein, weil die Elemente der ComboBox vom Typ MCB sind und als Referenzen immer eindeutig sind, auch wenn ihre Eigenschaften gleich sind. SelectedItem ist dann übrigens die selektierte jeweilige MCB-Instanz.


Was die Combobox NICHT weiß, ist, wie es aus einer Texteingabe eine Instanz von MCB erzeugt werden soll. Das solltest du ihm beibringen, indem du dich in den Prozess des Neueinfügens hängst.

LaTino

Thema: Lesenswerter Artikel: Hype Driven Development
Am im Forum: Smalltalk

(LaTino mit n, da bin ich empfindlich)

Der Vorwurf war nicht, dass du starke Meinungen vertrittst - das tue ich selbst gern und schätze es auch bei anderen - sondern, dass einige Folientexte mit Argumenten verwechselst und es nicht für nötig hältst, deine Aussagen zu untermauern. Das ist schade, weil, wie ich schon schrieb, deine Meinung durchaus kein Einzelfall ist, sondern in meiner täglichen Arbeit bei Projektverantwortlichen und im Management sogar relativ oft anzutreffen ist.

Ein für meine Begriffe sehr gutes Argument wäre ein Verweis darauf gewesen, dass man mit dem Einsatz agiler Methoden u.U. Gefahr läuft das zu tun, was im Link oben "hype driven development" genannt wird. Und die Risiken von "HDD" sind dort (Link) ja recht anschaulich dargestellt.

Zitat von Blaster
Wie gehst Du mit den nachfolgenden Problemen um:
1) Wie Du die Anaomlien, Inkosistenzen und Probleme während der Zunahme des HDD erkennst?
Zugegeben habe ich hier etwas Schwierigkeiten, zu erkennen, was du wissen möchtest. "Zunahme des HDD"? Inwiefern? Was der Autor spöttisch "HDD" nennt, also das Hinterherlaufen hinter Trends, wie soll das "zunehmen"? Entweder man verfällt dem Trend, oder nicht, das ist ein binärer Zustand. (Immer gesehen für ein Projekt.) Wenn man dem Trend verfällt, besteht das Risiko, dass man hinterher das Gegenteil von dem erreicht, was man wollte (dass es teurer wird, länger dauert, unzuverlässiger funktioniert). Wenn man dem Trend nicht verfällt, sondern auf bewährte Methoden zurückgreift, besteht das Risiko, dass man von den Vorteilen des Trends ggf. nicht profitiert, d.h. man vergibt sich die Chance, dass es funktioniert.

Wichtig auch: unter bewährte Methoden wird eine Softwarebutze, die seit Jahren SCRUM macht, eben auch SCRUM verstehen. Bewährt heisst: ich weiß, dass es für mich funktioniert, ich kenne die Vor- und Nachteile, und ich kann beides in meine Kalkulation einbeziehen und stelle im Projektnachlauf fest, dass diese Kalkulation nah an der Realität war. Insofern unterstützt der Link keinesfalls deine These, dass agile Methoden per sé ein "Run in das Mittelmaß" (was soll _das_ eigentlich bedeuten?) sind.
Zitat
Wie überzeugst Du
a) eure Kunden

Easy. Meine Kunden gehören - wenigstens die Entscheider - zu Unternehmen, wo die IT noch "EDV" und "DFÜ" genannt wird. Die wissen, dass COBOL das Maß der Dinge ist, weil sie Software im Einsatz haben, die damit Anfang der 70er geschrieben wurde und immer noch funktioniert. Überspitzt gesagt: wenn ich die überzeugen will, dass ihr Produkt mit einer gewissen Technologie/Methodik entwickelt werden soll, dann muss ich ihnen ein Beispielprojekt zeigen, dass mindestens schon 30 Jahre läuft. Alles andere wird für kurzfristige Trends gehalten. Ich kenne Entscheider, die halten OOP für einen dieser kurzfristigen Trends.
Zitat
b) deine Kollegen

Der schwierigste Part. Gute Entwickler sind faul. Wenn sie das Risiko sehen, dass sie mit einer Methode mehr Aufwand haben als mit der anderen, wählen sie im Normalfall das, was sie kennen. Wenn allerdings, um ein fiktives Beispiel zu nennen, 5 Kollegen von einer Konferenz kommen und jetzt alle künftigen Projekte in Rust machen wollen (nix gegen Rust, ich liebe die Sprache), dann lässt man sie Rust evaluieren. Zum einen dauert das lange genug, um die nachkonferenzliche Euphorie verfliegen zu lassen, zum anderen kommt dabei auch noch was Sinnvolles raus. Weiß man dann, welche Probleme man mit Rust lösen kann, kommen ein paar interne Projekte auf der grünen Wiese. Wenn die funktionieren, wird geschult und wenn dann ein Teilbereich eines Projekts aus den bestehenden Erfahrungen heraus am besten mit Rust umgesetzt wird, hat man das Know-How, die Leute und die Erfahrung, um auch Fehlschläge managen zu können.
Zitat
c) dem Management

Wenn mein Management sieht, dass ich ich nicht abwehre nach dem Prinzip "kenn ich nicht, fress ich nicht", sondern dass ich mir auch Gedanken betriebswirtschaftlicher Natur gemacht habe - Risikoanalyse zB - dann haben sie alles, was sie für eine Entscheidung benötigen. Stell ich mich hin und sage "auf der einen Folie im Internet stand "Only way out [..of agile project (dis)management] is rigorous Release Management, but more then [sic!] ITIL V3.", deshalb sollten wir das nicht machen" dann habe ich a) den falschen Job und wenn das Management dann auch noch auf mich hört, haben b) die auch den falschen Job.
Zitat
d) den Zuliefern

Zulieferer in dem Sinn haben wir nicht, wir stellen Software her, keine Autos. Teilweise hängen wir von Anbietern anderer Lösungen ab in dem Sinn, dass unsere Software mit deren kommunizieren muss. Ein aktuelles Projekt kommt mir dabei in den Sinn, wo unsere Software Daten verarbeiten und integrieren muss, die eine Reihe von Services eines Drittanbieters zur Verfügung stellt. Besagter Anbieter arbeitet agil, bzw glaubt das. Tatsächlich arbeitet er (aus meiner Sicht) einfach nur unorganisiert. Das führt dazu, dass wir als Konsumenten seiner Services so arbeiten: drei Wochen warten - neue Schnittstelle/neues Feature geht jetzt! - 3 Tage Arbeit - schade, die notwendige Schnittstelle xy tut noch nicht - drei Wochen warten und von vorn. Das ist frustrierend, bringt unseren Zeitplan und schlimmer noch den unseres Kunden durcheinander. Ich halte unseren Hintern aus Schwierigkeiten heraus, in dem ich immer klar kommuniziere, dass es hakt, wo es hakt, und wessen Zuständigkeit das ist. Zudem haben Kunde und ich eine Exit-Strategie ausgearbeitet, als sich langsam herauskristallisierte, wie das läuft. Ich werden den "Zulieferer" nicht überzeugen können, die Finger von Methode xy zu lassen, aber ich kann das Risiko erkennen und managen.
Zitat
3) Wie findest Du die wirklichen coolen, innovativen Entwicklungen, erstellt von den kreativsten Köpfen der Welt (den besten?!?) und erhälst Zugang? - Aka finding the underground and get in! - Denn diese sind die Letzten, die sich in der Öffenlichkeit stark produzieren, um sie zu finden.
Das ist zwar eine sehr romantische Vorstellung - die des braven, bescheidenen Hackers, der im Hinterhof in der Garage von Mutti the next hot thing strickt und kein Interesse hat, groß per PR auf sich aufmerksam zu machen - aber keine sehr realistische.

Beobachte den Markt (Technologien UND die Konkurrenz). Ruh dich nicht aus. Probiere Dinge. Gib deinen Mitarbeitern die Chance, an etwas zu scheitern und alle davon lernen zu lassen, ohne sie dabei zu demotivieren. Widerstehe der Versuchung, etwas Funktionierendes in einer anderen Technologie von Grund auf neu zu entwickeln. Trau keiner Powerpoint-Folie. Hör auf deinen Justiziar.

Das wären so meine Tipps aus 25 Jahren Softwareentwicklung und PM.
Zitat
HDD ist und war immer ein Run in das Mittelmaß!
S.u.a. Agiles M & D.

Da habe ich auch noch ein passendes Zitat.
Zitat von Obi-wan Kenobi
Only a Sith deals in absolutes.

LaTino

Thema: Lesenswerter Artikel: Hype Driven Development
Am im Forum: Smalltalk

Lesenswerter Artikel.

Hype Driven Development

LaTino

Thema: UML, Pflichtenheft, Feinspezifikationen vs. agile Methoden
Am im Forum: Smalltalk

@FZelle, was du beschreibst, ist auch ziemlich genau die übliche Vorgehensweise hier im Haus (auch bei vorherigen AG wurde so oder ähnlich vorgegangen[1]). Ich muss zu meiner Schande gestehen, dass ich die entsprechende Stelle nicht parat habe, aber ich meine, mich zu erinnern, dass im agile manifest etwas in der Art "ganz oder gar nicht" erwähnt wird. Und das lässt sich auch gut begründen. (Vermutlich scheitern auch Projekte daran, dass die agilen Methoden nicht konsequent durchgezogen werden, oder wie Abt sagt, "gelebt" werden.) Insofern betrachte ich diese Art der Softwareentwicklung nicht als agil.

LaTino
[1] die einzelnen Teams - 3-6 Entwickler - entscheiden selbst, wie sie vorgehen. Wir haben welche, die machen scrum nach Lehrbuch, und welche, die eher starr vorgehen, und welche, die sich gar nicht groß organisieren. Kommt auf den Teamleiter an. Solang die Ergebnisse korrekt und rechtzeitig vorliegen, quatscht da auch keiner rein. Gab auch mal so Sachen wie "pair programming friday", fällt mir da ein...das könnte man mal aufleben lassen.

EDIT: mal spasseshalber geschaut: Extreme Programming
Von den Punkten bis "Evolutionäre Praktiken" benutzt mein Team 10 bis 11 (von 12). Dennoch arbeiten wir nicht agil, nur weil wir dieselben Methoden benutzen.

Thema: UML, Pflichtenheft, Feinspezifikationen vs. agile Methoden
Am im Forum: Smalltalk

gfoidl:

Zitat von gfoidl
Klar muss es bei jedem (professionellen) Projekt eine Vorgabe geben, aber diese erfolgt -- eben aufgrund der sich ändernden Anforderungen od. erst sich während der Entwicklung ergebenden (neuen, geänderten) Anforderungen -- eher durch eine Roadmap, einen Kosten- und Laufzeitrahmen. Hier ist dann Aufgabe des Projekt-Leiters dafür zu sorgen, dass die "must-haves" auch (z.B. iterativ) umgesetzt werden und während der Entwicklung zusammen mit dem Auftraggeber immer neu abgestimmt und priorisiert werden.

Und da ist schon der (ein) Knackpunkt bei agilen Methoden. Es gibt keine Grundlagen für ein Angebot. Wie soll man sich an einem Ausschreibungsverfahren beteiligen, wenn schon in der Natur der Sache liegt, dass man den Aufwand gar nicht abschätzen kann? Und woran macht man eine Vertragserfüllung fest? Wie schaut's mit Regress und Mängeln aus, woran macht man die am fertigen Werk juristisch sicher fest? Die agilen Konzepte haben darauf keine überzeugenden Antworten, finde ich. Ich will mich nicht unbedingt auf blaster's Seite schlagen - seine starken Meinungen werden mMn nur ungenügend mit Argumenten gestützt. Aber: man muss zur Kenntnis nehmen, dass in der Projektwelt sehr reichlich Vorurteile ggü agiler Softwareentwicklung bestehen[1], und dass nicht alle dieser Vorurteile unbegründet sind.

Ich selber nutze sehr gern einige Methoden und Konzepte, wenn es passt, aber ich würde deshalb nicht behaupten wollen, dass wir agile Softwareentwicklung betreiben.

LaTino
Anekdote am Rande: voriges Jahr, Ausschreibung eines Projektes mit einem enormen Budget (eher acht als sieben Stellen) und der Aussicht auf einen Fuß in der Tür. Bevor wir dort in Delegation auftauchen und unser Konzept vorstellen dürfen, muss ich von jedem Beteiligten ein Resümee abgeben. Und was passiert: alle mit Schwerpunkt auf Agile werden schlichtweg abgelehnt. Weder durften die mit zur Präsentation, noch weiter am Projekt beteiligt werden. Hat für die eine oder andere hochgezogene Augenbraue gesorgt, dem Projekt aber absolut nicht geschadet, soviel muss ich zugeben.

Thema: UML, Pflichtenheft, Feinspezifikationen vs. agile Methoden
Am im Forum: Smalltalk

Zitat von Abt
Zitat von Blaster
Agile Methoden - wie SCRUM, Cristal Clear oder XP sind Anfängerkramm.

Wow. Dazu fällt mir nichts mehr ein.

Vielleicht, weil du dich um überwiegenden Teil in der agilen Szene bewegst?

diese Meinung ist in Projekten durchaus nicht selten. Nach dem Motto "agile ist eine nette Idee, funktioniert nur leider nicht, sobald man eine gewisse Projektgröße erreicht." Das liegt mMn nicht am Konzept an sich, sondern an der gefühlt riesigen Masse gescheiterter agiler Projekte. Ich glaub nur, dass es ein Trugschluss ist, dass dieses Scheitern am Konzept liegt.

Wasserfall, V-Modell und Konsorten für "echte" Projekte, scrum für überfinanzierte, kurzlebige Webfrickel-Startups. Die Aussage würden vermutlich mehr als die Hälfte der Projektleiter aus meinem Bekanntenkreis sofort unterschreiben. Ich selber nur mit einem "kommt darauf an"-Vorbehalt.

LaTino

Thema: UML, Pflichtenheft, Feinspezifikationen vs. agile Methoden
Am im Forum: Smalltalk

Geht bisschen vom Thema weg, aber ohne große Spezifikationen sind große Standards nicht definierbar (Kernapplikation ist das beste Beispiel, was mir dazu einfällt...das MUSS bis ins Kleinste spezifiziert/standardisiert sein, weil sonst jeder Akteur seine Suppe kocht und das Gesamtprojekt scheitern würde. Wenn man mal 5 Minuten Zeit hat: Die VDV-Kernapplikation herunterladen, beliebiges Dokument nehmen und reinschauen. Soweit ich mich erinnere, fand ich den Umgang mit UML gerade in der Spec ziemlich gelungen[1]).

Da kann man prima drüber streiten, schon klar. An den TE bleibt die Aussage: UML für Codegenerierung ist eine Idee, die sich nicht bewährt hat. Die Beschäftigung damit lohnt eher nicht.

LaTino
[1] heisst nicht, dass auf jeder zweiten Seite ein activity diagram ist. Bisschen stöbern lohnt.

Thema: UML, Pflichtenheft, Feinspezifikationen vs. agile Methoden
Am im Forum: Smalltalk

Da muss ich ein bisschen widersprechen. Große Spezifikationen[1] beinhalten sehr gerne noch UML, insbesonders activity, use cases, interaction und state diagrams. Was selten geworden ist, ist das, worauf du hinauswillst: Versuche, Code direkt aus einem Klassendiagramm zu generieren. Es hat sich gezeigt, dass das meistens nicht so zielführend ist - Begründung liefert Abt ja.

UML ist aber mehr als nur das, und wie gesagt, für Dokumentation, Spezifikation, Architekturbeschreibung und dergleichen sind die entsprechenden Diagrammtypen sehr gut geeignet und werden auch benutzt.

LaTino
[1] Beispiele:
SAP (diverse Specs)
VDV KA (e-Ticketing, VDV-Kernapplikation)
etliche Specs aus dem Gesundheitsbereich
Logistikspezifikationen
...

Thema: Suche ein gutes HttpClient/HttpListener-Beispiel
Am im Forum: Netzwerktechnologien

Zitat von Sandra
Ich habe WSDL Files, bekomme aber keine Verbindung, weil kein Connect, URL zu finden ist.

Dieser Satz ergibt keinen Sinn.

https://msdn.microsoft.com/de-de/library/aa751905(v=vs.110).aspx

Dann:


using(var client = new GeneratedClient(myBinding, myEndpointAddress))
   return client.BasicDataQuery(myBasicDataQueryRequest);

(Namen der Operation und der Kommunikationsobjekte natürlich nur geraten, die entnimmst du - ebenso wie die Bindung und den Endpunkt - der WSDL bzw. eben der Konfiguration)

LaTino