mboost-dp1
- Forside
- ⟨
- Forum
- ⟨
- Nyheder
Claus Jørgensen (44) skrev:
Selv Rust er bygget om omkring et modul system. Java, C#, Swift, Kotlin, Ruby, Python, PHP har alle et modul og pakkesystem. Det er kun C/C++ der ikke rigtigt har et.
Modul er et ord som betyder forskelligt for forskellige folk.
Men package management systemer er vist rimeligt ens for alle sprog idag.
Det er ikke fordi at de ikke findes til C/C++. Det gør de. Men det er et noget spredt felt. Det er der flere grunde til: meget kode er OS specifikt, C++ compilere er ikke binært kompatible på samme platform etc. Linux C/C++ bruger vel typisk deres distro package management til at hente libxxx med dependencies. Men der er andre. Jeg kan f.eks. godt lide VCPKG på Windows.
arne_v (46) skrev:De fleste open source produkter bruger OpenSSL for som implementering. Og hvis jeg skulle vælge et godt eksempel på open source kvalitet, så ville jeg ikke vælge OpenSSL!
God pointe, openSSL er crap. Men de fleste open source programmer i netværksstakken i Linux kan man ikke sætte en finger på.
Claus Jørgensen (44) skrev:#43
Korrekt kode != matematisk korrekt kode. "bugs" inkludere fejl hvor _funktionaliteten_ er inkorrekt, men selven koden er korrekt.
Så du er enig i udsagnet at alt IT altid har bugs? Hvis der havde været et "næsten" i den sætning ville jeg have været fuldstændig enig.
Et eksempel kan være simple microcontroller LED blinkere som laver LED lys show med kun en tast som input. Et sådan system kan godt ende med at være UDEN bugs. Men det er kun fordi der ikke er nogen afhængigheder og ekstremt få inputs (en tast) og et veldefineret output. Man kan så diskutere om det er et "IT system". Men der er da tale om software på mere end tre linjer.
#44 Jeg er da ikke uenig i dine betragtninger om continuous integration og unit test, plus good practices, fører til høj-kvalitetskode og at man normalt kun ser den slags inden for closed source.
Jeg vil bare tilføje at i min karriere og hvad jeg har hører fra mine bekendte, så er kode kvalitet ude i den virkelige verden, fra typiske mellemstore software leverandører... mangelfuld... for at sige det pænt. Næsten alle nyudklækkede programmører der kommer ud af universitetet og møder virkeligheden bliver chokeret over hvor crappy kode der skrives og hvor meget der bliver snydt på vægten mht. tests, dokumentation og good practice.
Der er selvfølgelig forskel fra branche til branche, og det er da muligt at Microsoft har en høj kvalitetsstandard, men ude i den brede almindelige software virkelighed bliver der lavet crap, på crap på crap.
Jeg fandt engang på en mundheld som jeg vil mene stadig holder meget godt: "Kode er præcis så crappy at det lige akkurat kan udføre den tiltænkte funktion"
Og her er det at open source kan have en fordel. Her er der tale om nørder der nusser om koden og et stort opland af frivillige der gør deres ypperste når de laver et pull request, for at bidrage med optimal kode.
Det andet aspekt er så tillid. Og i den sammenhæng vælger jeg open source når det virkelig gælder, f.eks. tager jeg open source password wallet programmet og ville iøvrigt aldrig lægge mine vigtige passwords i en cloud wallet. Jeg bruger ikke Google el. lign til mine vigtige email kontoer og jeg undgår Microsoft som mit daglige operativsystem. Det er ud fra en grundlæggende mistro til hvad Google måtte gøre med mine emails og fordi jeg ikke bryder mig om alt det scanneri og telemetri en moderne Windows hele tiden udfører.
larsp (53) skrev:
Jeg vil bare tilføje at i min karriere og hvad jeg har hører fra mine bekendte, så er kode kvalitet ude i den virkelige verden, fra typiske mellemstore software leverandører... mangelfuld... for at sige det pænt. Næsten alle nyudklækkede programmører der kommer ud af universitetet og møder virkeligheden bliver chokeret over hvor crappy kode der skrives og hvor meget der bliver snydt på vægten mht. tests, dokumentation og good practice.
Der er selvfølgelig forskel fra branche til branche, og det er da muligt at Microsoft har en høj kvalitetsstandard, men ude i den brede almindelige software virkelighed bliver der lavet crap, på crap på crap.
Jeg fandt engang på en mundheld som jeg vil mene stadig holder meget godt: "Kode er præcis så crappy at det lige akkurat kan udføre den tiltænkte funktion"
Danmark er ret slemt på det område.
Danmark har en erhvervsstruktur med mange små og mellemstore virksomheder.
Danmark har nogle af verdens dårligst uddannede IT folk (danske dataloger og IT ingeniører er rigtigt godt uddannede men de udgør en meget lille del af de danske IT folk).
Og så passer dansk mentalitet ikke så godt til benhård disciplin.
Claus Jørgensen (54) skrev:
Min erfaring er at 4 af de 5 store (Microsoft, Google, Apple, Amazon) har meget høj kode kvalitet, og at nr. 5, Facebook, er spaghetti kode :p
Jeg ved ikke hvad dit kriterie er for at være "stor", men jeg ville betragte firmaer som IBM, Oracle, SAP, Redhat som værende store (Redhat er nu blevet en del af IBM).
Og jeg har ingen bekente der arbejder for IBM, Oracle, SAP så jeg kan ikke kommentere på deres niveau af kode kvalitet.
Jeg har dog besøgt SAPs hovedkontor i Tyskland og snakket med deres chefer (i forbindelse med Skype for Business)
Jeg har dog besøgt SAPs hovedkontor i Tyskland og snakket med deres chefer (i forbindelse med Skype for Business)
Claus Jørgensen (39) skrev:
Jeg har skrevet meget open source, sikkert mere end de fleste herinde.
98-99% herinde har vel skrevet 0 linier OSS, så det er uden tvivl korrekt.
Jeg talte lige mine små projekter. Ca. 55000 linier.
Det er værre med antal brugere: formentligt meget tæt på 0.
:-)
arne_v (60) skrev:Claus Jørgensen (39) skrev:
Jeg har skrevet meget open source, sikkert mere end de fleste herinde.
98-99% herinde har vel skrevet 0 linier OSS, så det er uden tvivl korrekt.
Jeg talte lige mine små projekter. Ca. 55000 linier.
Det er værre med antal brugere: formentligt meget tæt på 0.
:-)
jeg har deltaget i en række open source projekter (fx 'moderne' genskabelser af retro spil fra bl.a. amiga og c64 tiden, obscure utilities til obscure formål som fx doom modding mv)
...det er altsammen til meget specifikke formål med meget snævne bruger skarer, så kan sagtens relatere til det med en meget lille brugerskare. på den anden side kan det være en velsignelse af en rando dude ikke pludselig får et flip over noget ligegyldigt
#61
Du har sikkert stadig 100 gange flere brugere end mig. Det der er slut bruger software.
Mit er libraries/tools til udviklere. Indenfor nogle meget snævre meget specialiserede områder.
Claus kan vel stadig kaldes C# udvikler (selvom det vel bliver til mere Swift nu om dage) - og en nysgerrig af slagsen. Jeg har 2 .NET thingies - en static aspect weaver og en mapper mellem .NET struct og native structs (mere avanceret end de indbyggede StructLayout, MarshalAs og Marshal.*). Mit gæt er at han aldrig har haft noget behov for nogle af delene.
Du har sikkert stadig 100 gange flere brugere end mig. Det der er slut bruger software.
Mit er libraries/tools til udviklere. Indenfor nogle meget snævre meget specialiserede områder.
Claus kan vel stadig kaldes C# udvikler (selvom det vel bliver til mere Swift nu om dage) - og en nysgerrig af slagsen. Jeg har 2 .NET thingies - en static aspect weaver og en mapper mellem .NET struct og native structs (mere avanceret end de indbyggede StructLayout, MarshalAs og Marshal.*). Mit gæt er at han aldrig har haft noget behov for nogle af delene.
Det har jeg faktisk, i 2 projekter.arne_v (62) skrev:Jeg har 2 .NET thingies - en static aspect weaver og en mapper mellem .NET struct og native structs (mere avanceret end de indbyggede StructLayout, MarshalAs og Marshal.*). Mit gæt er at han aldrig har haft noget behov for nogle af delene.
En reverse-engineered game server til et Koreansk mmorpg, og 5 semester afslutnings projekt på Ingeniørhøjskolen hvor vi skulle programmere en robotarm til at sortere klodser
Jeg skrev et (async) API med marshalling af alle robotarmskommandoerne så mine medstuderende kunne nemmere programmere de nødvendige set af kommandoer og brugerfladen.
Dog kan jeg ikke sige at nogensinde have fundet en AOP løsning der gav mening i C#.
Claus Jørgensen (63) skrev:
Dog kan jeg ikke sige at nogensinde have fundet en AOP løsning der gav mening i C#.
AOP kan være en meget elegant måde at tilføje noget funktionalitet eventuelt midlertidigt til noget kode.
Men der er naturligvis en vis risiko for at man fucker up. Man kan skyde sig selv i foden. Med en 155 mm haubitz!
Claus Jørgensen (63) skrev:Det har jeg faktisk, i 2 projekter.arne_v (62) skrev:Jeg har 2 .NET thingies - en static aspect weaver og en mapper mellem .NET struct og native structs (mere avanceret end de indbyggede StructLayout, MarshalAs og Marshal.*). Mit gæt er at han aldrig har haft noget behov for nogle af delene.
En reverse-engineered game server til et Koreansk mmorpg, og 5 semester afslutnings projekt på Ingeniørhøjskolen hvor vi skulle programmere en robotarm til at sortere klodser
Jeg skrev et (async) API med marshalling af alle robotarmskommandoerne så mine medstuderende kunne nemmere programmere de nødvendige set af kommandoer og brugerfladen.
Jeg fik aldrig fulgt op på den her.
Simpelt eksempel med NRecord library:
using System;
using System.IO;
using Vajhoej.Record;
namespace Simple
{
[Struct]
public class Data
{
[StructField(N=0,Type=FieldType.INT4)]
public int Id;
[StructField(N=1,Type=FieldType.INT2)]
public int V1;
[StructField(N=2,Type=FieldType.INT2)]
public int V2;
[StructField(N=3,Type=FieldType.FIXSTRNULTERM,Length=8,Encoding="ISO-8859-1")]
public string S;
public override string ToString()
{
return string.Format("({0},{1},{2},{3})", Id, V1, V2, S);
}
}
public class Program
{
public static void Main(string[] args)
{
byte[] b = { 0x01, 0x00, 0x00, 0x00, // Id = 1
0x01, 0x00, // V1 = 1
0x02, 0x00, // V2 = 2
0x41, 0x42, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, // S = "ABC"
0x002, 0x00, 0x00, 0x00, // Id = 2
0x02, 0x00, // V1 = 2
0x03, 0x00, // V3 = 3
0x41, 0x42, 0x43, 0x44, 0x45, 0x00, 0x00, 0x00 }; // S = "ABCDE"
StructReader sr = new StructReader(b);
while(sr.More)
{
Data o = sr.Read<Data>(typeof(Data));
Console.WriteLine(o);
}
Console.ReadKey();
}
}
}
Det er der ikke meget pointe i - det indbyggede kan det samme:
using System;
using System.IO;
using System.Runtime.InteropServices;
namespace Alternative
{
[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Ansi)]
public class Data
{
[MarshalAs(UnmanagedType.I4)]
public int Id;
[MarshalAs(UnmanagedType.I2)]
public short V1;
[MarshalAs(UnmanagedType.I2)]
public short V2;
[MarshalAs(UnmanagedType.ByValTStr,SizeConst=8)]
public string S;
public override string ToString()
{
return string.Format("({0},{1},{2},{3})", Id, V1, V2, S);
}
}
public class Program
{
public static void Main(string[] args)
{
byte[] b = { 0x01, 0x00, 0x00, 0x00, // Id = 1
0x01, 0x00, // V1 = 1
0x02, 0x00, // V2 = 2
0x41, 0x42, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, // S = "ABC"
0x002, 0x00, 0x00, 0x00, // Id = 2
0x02, 0x00, // V1 = 2
0x03, 0x00, // V2 = 3
0x41, 0x42, 0x43, 0x44, 0x45, 0x00, 0x00, 0x00 }; // S = "ABCDE"
int bufsiz = Marshal.SizeOf(typeof(Data));
IntPtr buf = Marshal.AllocHGlobal(bufsiz);
int ix = 0;
while(ix < b.Length)
{
Marshal.Copy(b, ix, buf, bufsiz);
Data o = (Data)Marshal.PtrToStructure(buf, typeof(Data));
Console.WriteLine(o);
ix += bufsiz;
}
Marshal.FreeHGlobal(buf);
Console.ReadKey();
}
}
}
Men her er et mere avanceret eksempel, som ikke er til at lave i det indbyggede:
using System;
using System.IO;
using Vajhoej.Record;
namespace Advanced
{
[Struct]
public class Data
{
[StructField(N=0,Type=FieldType.INT4)]
public int Id;
[StructField(N=1,Type=FieldType.INT1)]
[Selector]
[SubType(Value=1,Type=typeof(DataA))]
[SubType(Value=2,Type=typeof(DataB))]
[SubType(Value=3,Type=typeof(DataC))]
public int Type;
}
[Struct]
public class DataA : Data
{
[StructField(N=2,Type=FieldType.INT4)]
public int V;
public override string ToString()
{
return string.Format("(A:{0},{1})", Id, V);
}
}
[Struct]
public class DataB : Data
{
[StructField(N=2,Type=FieldType.INT1)]
public int Count;
[ArrayField(Elements=0)]
[StructField(N=3,Type=FieldType.INT4)]
public int[] A;
public override string ToString()
{
return string.Format("(B:{0},{1})", Id, string.Join(" ", A));
}
}
[Struct]
public class DataC : Data
{
[StructField(N=2,Type=FieldType.FIXSTRNULTERM,Length=8,Encoding="ISO-8859-1")]
public string S;
public override string ToString()
{
return string.Format("(C:{0},{1})", Id, S);
}
}
public class Program
{
public static void Main(string[] args)
{
byte[] b = { 0x01, 0x00, 0x00, 0x00, // Id = 1
0x01, // Type = DataA
0x11, 0x00, 0x00, 0x00, // V = 17
0x02, 0x00, 0x00, 0x00, // Id = 2
0x03, // Type = DataC
0x41, 0x42, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, // S = "ABC"
0x03, 0x00, 0x00, 0x00, // Id = 3
0x02, // Type = DataB
0x03, // Count = 3
0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00 }; // A = 1 2 3
StructReader sr = new StructReader(b);
while(sr.More)
{
Data o = sr.Read<Data>(typeof(Data), null, null, (ctx, n) => { if(n == 3) { DataB o2 = (DataB)ctx; o2.A = new int[o2.Count]; return o2.Count; } else { return -1; }} );
Console.WriteLine(o);
}
Console.ReadKey();
}
}
}
Opret dig som bruger i dag
Det er gratis, og du binder dig ikke til noget.
Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.