was muss ein Progammierer können?



  • Thema: was muss ein Progammierer können?

    programmieren 🙄



  • Original erstellt von <manu>:
    **
    was muss ein Programmierer umbedingt können?**

    garnichts!

    ...aber ich stelle mal eine andere Frage :

    Was sollte ein Programmierer können?



  • Original erstellt von Gregor:
    **
    Was sollte ein Programmierer können?**

    Ein Programmierer sollte...

    • ... logisch denken können.
    • ... zumindest etwas Mathe können.
    • ... Englisch können.
    • ... Komplexität beherrschen können.
    • ... programmieren können.
    • ... sich mit dem inneren Aufbau von Computern auskennen.
    • ...


  • Original erstellt von Gregor:
    **
    [...]... sich mit dem inneren Aufbau von Computern auskennen.
    [...]**

    in wie fern? ich will das ja nicht bestreiten, denke aber, dass man ohne compilerbau- und rechnerarchitekturkenntnisse sehr sehr weit in der welt eines programmieres kommen kann. (gerade als java-progger :p)
    hardwarenahes programmieren fällt weitgehend flach ohne die oben genannten kenntnisse, allerdings ist dies ja auch nur ein kleines gebiet von vielen.

    viele grüße
    stefan



  • Original erstellt von Ste.fun:
    **...denke aber, dass man ohne compilerbau- und rechnerarchitekturkenntnisse sehr sehr weit in der welt eines programmieres kommen kann. (gerade als java-progger :p)
    **

    Nein! ...auch Javaprogramme werden letztendlich von der Hardware ausgeführt. Wenn Javaprogramme performant sein sollen, dann sollte man schon die darunterliegende Hardware kennen. Zumindest sollte man generelle Kenntnisse in diesem Gebiet haben. Woher soll man sonst wissen, was man beim Programmieren besser meiden sollte und was gut ist?!



  • was muss ein Progammierer können?

    Ich würde mal sagen, dass es sehr stark davon abhängt, was und wofür er programmiert. (Auch Leute, die CNC-Fräsen programmieren bezeichnen sich oft als Programmierer).
    Wenn jemand Kontroller programmiert, sollte er Hardware-Kenntnisse haben.
    Wenn jemand Software für die Berechnung von Versicherungsprämien erstellt, fehlt ihm sicher nicht viel, wenn er sich mit Hardware überhaupt nicht auskennt.

    [edit]
    @Gregor
    Performance ist nicht immer das Wichtigste. Vor allem bei großen Projekten steht (meist)die Wartbarkeit im Vordergrund.
    [/edit]

    [ Dieser Beitrag wurde am 03.01.2003 um 16:13 Uhr von Kauz01 editiert. ]



  • Original erstellt von Kauz01:
    Wenn jemand Software für die Berechnung von Versicherungsprämien erstellt, fehlt ihm sicher nicht viel, wenn er sich mit Hardware überhaupt nicht auskennt.

    Hm... mag sein. Auf der anderen Seite, denk mal an die zahllosen Webseiten, die sich nur quälend aufbauen, weil soviele Elemente down geloadet werden müssen. Im Intranet sah die Sache bestimmt sehr gut aus - bei einer 100MBit-Anbindung an den Server.

    Hier hat man von dem Webentwickler auch gesagt:
    - er soll Webdesign können
    - er soll die Produkte der Firma kennen
    - ach, Hardwarekenntnisse braucht er bei seinem Job nicht

    Und dann quält er Leute mit ISDN, weil er eben nicht den Überblick über Hardware und die ganzen Konfigurationen hat, weil er einfach nicht weiß womit gearbeitet wird. Er sieht den PC als Blackbox, loggt sich ein, macht seine Webseiten, gibt diese frei. Völlig losgelöst von der Realität und von den Anwendern.

    Ich denke, daß auch bei reinen Datenbankentwicklern derartige Probleme irgendwann auftreten... wenn es um die zu schiebenden Datenmengen geht, um Engpässe auf dem Mainframe, um Timeslots, usw. Grundsätzlich halte ich es für jeden Softwareentwickler bedenklich, wenn er keine Kenntnisse von seinem System hat. Stell Dir vor, jemand entwickelt einfach unter Java, ohne zu wissen was die ganze Sache mit virtueller Maschine auf einem System bedeutet. Da gibt's bestimmt einige, für die ist das einfach ein Compiler und ein Fenster auf dem Schirm, wo sie auf "compilieren" gehen um das Programm zu erstellen.



  • @Marc++us
    Es war auch nicht so gemeint, dass man, unabhängig davon was man programmiert, keine Hardware-Kenntninsse haben muss, sondern, dass die Anforderung an die Kenntnis der Maschine, mit der gearbeitet wird, von der Aufgabenstellung der Programmierung abhängt (oder zumindest abhängen sollte).



  • @Gregor
    Naja, ich will dir nicht widersprechen, aber wirklich überzeugt haste mich nicht :p
    Ich meine, klar jede Software wird von der Hardware ausgeführt. Aber interessiert mich da die Hardware so sehr? Gib mir doch mal bitte einpaar Beispiele. Zum Beispiel das Schreiben von "final"-Methoden, wenn Polymorphie nicht benötigt wird (Java). Das holt nochmal Geschwindigkeit aus den Programmen, was da die Hardware genau macht, wäre ganz interessant zu wissen, kann mir aber auch egal sein.
    Es gibt "fertige" Datenstrukturen und Algorithmen. Wenn ich einen Quick-Sort implementieren möchte, brauche ich auch keine Hardwarekenntnisse. Für eine Hashtabelle ebenfalls nicht. Die Implementierung eines Design-Pattern ist auch nicht hardwarenah. Das einzige was der Programmierer hier beherrschen sollte, ist seine Programmiersprache. Zu weit in die Tiefe zu gehen ist meistens überflüssig. Sicher ist es immer gut, mehr zu wissen als man momentan wissen muss. Trotzdem denke ich, dass ein einfacher Programmierer, sofern er nicht gerade direkt mit Maschinensprachen arbeitet, getrost auf Hardwarekenntnisse (Rechnerarchitekur) verzichten darf. Wenn ein Informatiker gefragt wird, was eine MMU sei und er keinen Rat weiß, schauts in meinen Augen schon etwas blöd aus, aber ein Programmierer brauch das nicht wissen.
    Genau so es ich das auch mit Compilerbau. Es ist gut zu wissen wie diese Wunderwerke funktionieren, aber einen schreiben, wird mal wohl nie.

    Viele Grüße
    Stefan

    PS: Swing unter Java kannst du z.B. überhaupt nicht hardwarenah programmieren... (Bridgesystem).

    edit:
    Naja, wenn ich mir Marc++us beitrag so anschaue, muss ich gestehen, dass ich wohl etwas zu krass in das Hardwaregebiet vorgedrungen bin. Liegt wohl daran, weil neben mir ein dicker fetter Ordner mit der Aufschrift "Rechnerarchitektur" liegt. 🙄
    Nun denn, ein Programmierer sollte wissen, welche Hardware (PC-Systeme & Kompnenten) aktuell sind, damit er seine Programme an die Leistungsfähigkeit der Rechner seiner Kunden anpassen kann 🙂

    [ Dieser Beitrag wurde am 03.01.2003 um 17:44 Uhr von Ste.fun editiert. ]



  • Ok, noch mal ein anderes Beispiel:

    Ein (normaler) Programmierer sollte wissen, daß er mit einem Zeigerzugriff keine Werte im Speicher eines anderen Programms überschreiben kann.

    Er soll wissen, daß dies durch virtuelle Adressräumeverhindert wird.

    Und wenn er an dieser Stelle nicht fragt "was sind denn eigentlich virtuelle Adressräume" und er nicht auf den Begriff MMU stößt, so ist er in meinen Augen ein schlechter Programmierer (Grund: Interesselosigkeit an Fakten aus verwandten Fachgebieten), und wenn er hundertmal das Wissen über die Funktionsweise einer MMU für seinen Quicksort-Algorithmus nicht benötigt.

    😉

    [ Dieser Beitrag wurde am 03.01.2003 um 18:24 Uhr von Marc++us editiert. ]



  • :p 🙂
    <ohne Worte>



  • Mir fällt da grad noch etwas ein, was Programmierer können sollten:

    Sie sollten die Programme die sie benutzen auch bedienen können! Die wenigsten die ich kenne beherrschen ihre Programme und reizen deren Leistungspotential aus.

    Viele Grüße
    Stefan



  • Wenn man Interesse und Spass am programmieren hat wird man auch Interesse am Computer bzw. an der Hardware haben und gut kann in einem Gebiet kann man nur sein wenn man sich dafür begeistert und wie bereits erwähnt wer sich dafür begeistert wird sich auch über die Hardware informieren.
    Und wenn man bemüht ist immer das letzte aus seinen Programmen rasuzuholen dann
    kommt man auch da nicht vorbei.

    Theoretisch kann man auch super Programme schreiben ohne zu Wissen wie eine verkette Liste funktioniert bzw. ohne ein "Algorithmen in ..." Buch zu besitzen, weil es das meist schon in der Standardlib gibt bzw. es genug freie Bibliotheken im Web gibt.



  • Ich denke dass wichtigste was einen Programmierer ausmacht, ist die Fähigkeit seinen eigenen Code zu verstehen.
    Es ist erstaunlich wieviele Leute irgendwelche Programmzeilen aus dem Tutorial X, oder der Seite Y nehmen und einfach nur "copien&pasten". Dass das in die Hose geht ist eigentlich immer garantiert.

    Aber auch beim Bugfinding probieren viele einfach nur *irgendwas* aus. x+=2 klappt net ?? machen wir daraus ein x+=3. Klappt nicht ? Hmm, wie siehts mit x+=4 aus ?
    Fehlermachen ist wichtig ! Durch Fehler lernt man was wie man bestimmte Fallstricke meidet und umgeht, und vor allem : Man lernt wies NICHT geht 🙂 Durch simples rumprobieren (Prinzip Trial&Error) geht dieser Effekt verloren.

    [edit]

    Orginal erstellt von Mahatma Ghandi
    If you loose, don't loose the lesson

    [/edit]

    [ Dieser Beitrag wurde am 03.01.2003 um 20:05 Uhr von Headhunter editiert. ]



  • @ Ste.fun : Hier ein einfaches Beispiel, das zeigt, dass man mit generellen Hardware-Kenntnissen besseren (schnelleren) Code schreibt (in Java). ...so groß ist der Gewinn hier aber nicht (nur etwas mehr als 10%) :
    [java]
    public class Test
    {
    public static void main (String [] args)
    {
    int size = 150000;
    System.out.println ("Variante 1 :");
    long time = System.currentTimeMillis();
    {
    int [] values = new int [size];
    for (int i = 0 ; i < 20000 ; ++i)
    {
    for (int j = 0 ; j < size ; ++j)
    {
    ++values[j];
    }
    }
    int a = 0;
    for (int j = 0 ; j < size ; ++j)
    {
    a += values [j];
    }
    System.out.println ("Zahl : " + a);
    }
    System.out.println ("Zeit : " + (System.currentTimeMillis() - time));
    System.out.println ("Variante 2 :");
    time = System.currentTimeMillis();
    {
    int [] values = new int [size];
    for (int j = 0 ; j < size ; ++j)
    {
    for (int i = 0 ; i < 20000 ; ++i)
    {
    ++values[j];
    }
    }
    int a = 0;
    for (int j = 0 ; j < size ; ++j)
    {
    a += values [j];
    }
    System.out.println ("Zahl : " + a);
    }
    System.out.println ("Zeit : " + (System.currentTimeMillis() - time));
    }
    }[/code]
    Ausgabe bei mir :

    Variante 1 :
    Zahl : -1294967296
    Zeit : 28060
    Variante 2 :
    Zahl : -1294967296
    Zeit : 24906



  • @Gregor: Füge bei size nochmal 2 Nullen an *g*. Wenn die JRT das mitmacht ein geiler Test.



  • @Gregor:
    Danke für das nette Beispiel! Auf meiner Maschine war der Geschwindigkeitsvorteil sogar knapp 100%!!

    Variante 1 :
    Zahl : -1294967296
    Zeit : 113857
    Variante 2 :
    Zahl : -1294967296
    Zeit : 58300

    Viele Grüße
    Stefan



  • ...ich habe die Taktfrequenz erhöht und eine 0 angehängt!

    Ausgabe :

    Variante 1 :
    Zahl : -64771072
    Zeit : 208830
    Variante 2 :
    Zahl : -64771072
    Zeit : 167210

    ...mehr Zeit nehm ich mir dafür nicht. Wenn einer seinen Rechner mal ne Nacht lang damit beschäftigen will, dann kann er size ja noch weiter erhöhen. Wenn die JVM zu wenig Speicher bereitstellt, dann startet er das ganze einfach mit

    java -Xmx192m Test

    ...oder mit einer anderen Zahl statt 192. Diese Zahl gibt den maximal belegbaren Speicher an.

    ...wenn die Array-Größe mehr Speicher braucht, als RAM da ist, dann sollte Variante 1 noch deutlich langsamer werden. 🙂



  • Hab grad nochmal ein paar Testläufe gestartet. Keine Ahnung wie der Rechner auf die 100%-ige Geschwindigkeitsteiguerung kam. Feststeht, dass Variante2 auf jedenfall schneller ist. Bei mir um 20-30%.

    Viele Grüße
    Stefan

    PS: Ich gebe mich ja geschlagen, ein Programmierer sollte auch gute Hardwarekenntnisse haben... *böseblickezumarc++usundgregorwerf* 😉



  • Ich hab das auch mal probiert, ist ja erstaunlich, was das für einen Unterschied macht (bei mir auch 30%). Falls es sonst noch jemand mal auf die Schnelle ausprobieren will hab ich mal ein Applet dazu gemacht, mit drei verschiedenen größen von size:
    1500000


Anmelden zum Antworten