markk: An Programmieren Interessierter einführen

Tag allerseits,

ich habe einen engen Befreundeten, der mittlerweile Interesse an Programmierung gefunden hat bzw. damit liebäugelt, programmieren zu erlernen.

Er kommt aus einem gänzlich anderen Umfeld (Medizin), und ist begeistert von der stetigen Weiterentwicklung der IT, und möchte halt schauen, ob das (privat) etwas für ihn ist.

Lernbegeisterung ist definitiv gegeben, und er ist auch nicht sehr It-fern, liest z.B. hin und wieder Hacker-News oder besucht CCC-Events.

Als Anwendungsfall haben wir / er sich ausgedacht, einen recht simplen Kalkulator zu entwickeln, der ihm (da Sportler) ausrechnet, wie sein average pace auf einer gelaufenen Strecke war. Also eigentlich ein Drei-Zeiler. Allerdings - und das wird für Anfänger wahrscheinlich ein wichtiges "Erfolgs/Begeisterungs"-Kriterium sein - sollten die Werte per UI eingegeben werden können.

Nun überlege ich, welche Technologie hier angebracht wäre.

Kurz zu meinem Background: +20 Jahre in der IT. Architekt im Cloud- und Microservice-Umfeld. Kubernetes, AWS, Docker, Java EE. Aber auch Node, .NET, Python, PHP. Mit starkem Fokus auf Skalierbarkeit, Testing und Ops.

Und aufgrund meiner Betriebsblindheit fällt mir da nicht wirklich etwas passendes zu ein. Für den schnellen Erfolg würde ich fast zu jsfiddle raten, um erst einmal schnelle Ergebnisse zu erzielen und vor allem das Interesse zu fördern. Mein IT-Herz sagt nun natürlich: Bitte objekt-orientiert, bitte skalierbar, bitte test-driven, bitte RESTful API etc.

Also, hat einer hier eine gute Idee, wie man das initiale Interesse fördern kann, jedoch zeitgleich auch tatsächliche Softwareentwicklung nahebringen kann (ohne ihn ob der Schar an Technologien und Know-How gleich zu verscheuchen)?

Meine aktuelle Idee ist es, ihm einen Kurs bei udemy (or s.th. else) zu empfehlen, um erst einmal rudimentäre Kenntnisse zu vermitteln - was allerdings auch schon wieder abschreckend sein kann.

Vielen Dank & MfG Markk

  1. Tach!

    Mein IT-Herz sagt nun natürlich: Bitte objekt-orientiert, bitte skalierbar, bitte test-driven, bitte RESTful API etc.

    Das sind Themen, die man für kleine private Projekte nicht benötigt. Objektorientierung kommt von selbst. Wichtiger sind Vorgehensweisen, zum Beispiel wie man die Aufgabenstellung in kleine Teile herunterbricht und diese Stück für Stück implementiert. Ebenso wie man mit Problemen umgeht, wie man den Programmablauf nachvollziehen und die beteiligten Variablen beobachten kann, kurz das Debugging.

    dedlfix.

  2. Hallo markk,

    das Schlimme ist, dass es ein so irrsinnig breites Spektrum an Technologien gibt.

    Im Web: Serverorientiert (z.B. PHP) oder mit JavaScript

    Als App: Millionen von Programmiersprachen drängen sich auf. Gerne nimmt man da eine, wo es eine kostenlose Entwicklungsumgebung gibt, also z.B. Eclipse für Java oder Visual Studio Community/Express für C# oder VB.NET.

    Man kann kaum raten, in welche Richtung man einen Anfänger weisen soll. Dazu müsste etwas über seine grundsätzlichen Interessen bekannt sein.

    "Einfach mal programmieren lernen", tja. "Einfach mal Sport machen". Welche Sportart denn?

    Rolf

    --
    sumpsi - posui - clusi
  3. Hallo Markk

    Nun überlege ich, welche Technologie hier angebracht wäre.

    Insofern noch keine thematische Präferenz vorliegt, wäre als allgemeine Empfehlung für einen Programmieranfänger Python sicher nicht die schlechteste Wahl.

    Die Sprache ist high-level genug, um sich nicht mit Sachen wie Speichermanagement oder Pointerarithmetik beschäftigen zu müssen. Das heißt, es ist kein tieferes Wissen über die Funktionsweise eines Computers nötig, um Programme in Python zu schreiben. Insbesondere Anfänger sind genug damit beschäftigt, sich auf die Logik ihres Programms sowie die korrekte Verwendung der Syntax der Sprache zu konzentrieren.

    Die Syntax von Python ist zudem vergleichsweise einfach. Gute Lesbarkeit war ja ein erklärtes Ziel bei der Entwicklung der Sprache. Die wichtigsten Regeln sind hier schnell erlernt. Auch das Typsystem von Python ist anfängerfreundlich. Python ist stark typisiert, das heißt, es gibt keine impliziten Typkonvertierungen, bei denen Informationen verloren gehen. – Nicht nur Programmieranfänger kommen mit stark typisierten Sprachen oft besser klar als mit schwach typisierten Sprachen, wie zum Beispiel JavaScript.

    # Let Python infer the types
    
    def mul(a, b):
        return a * b
    
    
    # or give some hints
    
    def concat(a: str, b: str) -> str:
        return a + b
    

    Andererseits ist Python aber auch eine dynamische Sprache, das heißt, es muss dem Typsystem nicht bei jedem Schritt und Tritt der Typ jeder Variable und jedes Parameters bekanntgegeben werden, auch wenn Typannotationen wie in dem Beispiel oben mittlerweile möglich sind. Das macht es leichter, sich auf das Wesentliche zu konzentrieren.

    Python ist außerdem nicht auf ein Paradigma beschränkt. Strukturierte, prozedurale Programmierung, objektorientierte Programmierung und auch funktionale Programmierung werden durch entsprechende Sprachkonstrukte unterstützt. Anders als bei einigen anderen Sprachen, gibt es hier keinen Zwang, sich gleich zu Beginn mit den Aspekten eines bestimmten Paradigmas zu befassen. Das sehe ich als großen Vorteil.

    Ebenfalls von Vorteil ist die sehr umfangreiche Standardbibliothek von Python. Für die allermeisten Projekte, mit denen sich ein Programmieranfänger beschäftigt, wird die dort bereitgestellte Funktionalität völlig ausreichend sein. Wer doch über den Tellerrand hinausschauen möchte, wird ein sehr reichhaltiges Ökosystem vorfinden.

    Was direkt zum nächsten Punkt führt, der für Python spricht, nämlich die praktische Relevanz. Python ist eine der am meisten verwendeten Programmiersprachen der Welt und nicht nur eine toy language für Anfänger. Das hat auch zur Folge, dass es enorm viele gute Artikel und Tutorials im Internet gibt, die beim Lernen der Sprache behilflich sind. Und es gibt sehr viele Menschen die Python beherrschen, dich ja wohl eingeschlossen, die hilfreiche Ratschläge geben können.

    Unabhängig von der Wahl der Programmiersprache würde ich aber dringend davon abraten, einen Programmieranfänger wie deinen Freund mit irgendwelchen Konzepten zu behelligen, die nicht absolut nötig sind für den aktuellen Lernfortschritt. Vergiss nicht, wie lange du selbst gebraucht hast, um das Wissen zu erwerben, das du heute hast! Meine Erfahrung aus den entsprechenden Kursen an der Universität ist, dass diejenigen, die vor dem Besuch der Kurse nie programmiert haben, von der Fülle der Konzepte, die ihnen dort an den Kopf geworfen werden, schlicht erschlagen werden. Das führt dann sehr schnell zu Frust und Resignation, und keineswegs dazu, dass die Leute schneller gute Programmierer und Software‐Entwickler werden. Der Spaß bleibt da auf der Strecke.

    Wichtiger als das Wissen um irgendwelche Programmierparadigmen oder abstrakte Modelle ist es für Anfänger, Problemlösungsstrategien an die Hand zu bekommen. Es ist frustrierend, wenn man sich eine Aufgabe gestellt hat, die nicht übermäßig anspruchsvoll erscheint, an der man als Anfänger aber dennoch scheitert, weil man an einen Punkt kommt, an dem man einfach nicht mehr weiter weiß.

    Wie kann ich ein großes, schweres Problem in viele kleine, lösbare Probleme zerlegen? Wie kann ich überprüfen, ob mein Programm das tut, was es soll? Wie finde ich heraus, warum es nicht das tut, was es soll? Wo finde ich Informationen, die mir bei der Lösung meiner Probleme weiterhelfen? – Antworten auf diese Fragen zu finden, sollte absoluten Vorrang haben. Sonst wird sich schon bald ein Gefühl der Überforderung einstellen und der anfängliche Elan verflogen sein.

    Viele Grüße,

    Orlok

    1. Tach!

      Insofern noch keine thematische Präferenz vorliegt, wäre als allgemeine Empfehlung für einen Programmieranfänger Python sicher nicht die schlechteste Wahl.

      Wenn es darum geht, Programmieren zu lernen, ist Python ziemlich ok. Allerdings habe ich da so meine Bedenken, was die Praktikabilität angeht. Man möchte ja am Ende auch etwas haben, mit dem man seine Aufgabenstellungen umsetzen kann. Und da empfinde ich Python ein wenig problematisch, weil es sich recht wenig heimisch auf den Systemen anfühlt.

      Die Linux/Unix-Kommandozeilenumgebung ist da noch die einfachste Geschichte, da läuft alles, was eine Shebang kennt. Zu GUI-Programmen dort kann ich nichts weiter sagen. Da weiß ich nicht, wie schwer oder einfach das generelle Programmieren damit ist und wie sich Python auf dem Gebiet schlägt. Vor Äonen hatte ich mal was mit Qt versucht und fand es einfach schrecklich im Vergleich zu Windows Forms. Magic Strings für alles blieben mir als schlechtes Beispiel im Gedächtnis. Das Ergebnis passte dann auch weder dahin noch dorthin, sondern sah eigen aus.

      Bei browserseitiger Programmierung kommt man am heiligen Dreigespann nicht wirklich vorbei. Dafür braucht man Python und Alternativen nicht weiter zu betrachten.

      Die Unterstützung für serverseitige Webanwendungen ist vorhanden, aber das war nicht das Hauptziel von Python. Im Vergleich dazu fand ich PHP den leichteren Einstieg, inklusive administrativen Aufwand, den Webserver zu konfigurieren. Mag heute vielleicht einfacher geworden sein.


      Wie du auch am Ende deines Postings aufgezeigt hast, sind Methoden neben den Grundlagen einer Sprache vor allem diejenigen für Problemlösungen und Herangehensweisen der wichtigste Punkt beim Programmieren. Man muss am Ende nicht alles wissen, es hilft aber sehr, die richtigen Fragen formulieren zu können, damit man Lösungen suchen kann. Zum Beispiel ist "mein Programm läuft nicht, kannst du mir helfen?" nicht die Art von Fragen, die man beantworten kann. Man sollte schon in der Lage sein, das Problem auf konkrete Stellen im Code eingrenzen zu können.

      Dann aber muss man mal perspektivisch fragen, welche Art von Aufgabenstellungen der Proband zu lösen gedenkt. Ebenso ist auch das eingesetzte oder angestrebte Betriebssystem zu beachten. Und daraus sollte man ableiten, ob man den Wegweiser eher in Richtung Desktop- oder Webanwendung zeigen lassen sollte. Zumindest vorerst.

      Allerdings sind Webanwendungen zwar heutzutage mehr gefragt als Desktopanwendungen. Doch sehe ich dafür auch die größere Hürde für den Einstieg. Man muss das Konzept hinter der Trennung zwischen Struktur, Aussehen und Funktionalität lernen und verinnerlichen, und auch Erfahrungen sammeln, welcher Teil der Anwendung wohingehört. Desktopanwendungserstellung sehe ich da als pflegeleichter an. Vor allem wenn sie so einfach geht wie bei Windows Forms. Komponente aus der Toolbox aufs Form/Fenster ziehen, Eventhandler befüllen, läuft (abzüglich logischer Fehler). Aussehen kann man mit den Eigenschaften der Komponente beeinflussen. Die sind da auch gleich alle aufgelistet und müssen nicht wie bei CSS erstmal in irgendeiner Dokumentation gefunden werden. Klar gibt es auch hier bessere/modernere Systeme. Aber für den Anfang und Hausgebrauch ist die Lernkurve ein nicht unwichtiges Kriterium.

      Also erstmal: wo soll der Weg hingehen?

      dedlfix.

      1. Die vom TO genannte Aufgabe würde ich allerdings wahrscheinlich sogar in Excel-VBA lösen...

        Und da empfinde ich Python ein wenig problematisch, weil es sich recht wenig heimisch auf den Systemen anfühlt.

        Wie meinst Du das? Ich hab mir mal schnell ein Testskript gesucht...

        #!/usr/bin/python3
        from tkinter import *
        from tkinter import ttk
        
        def calculate(*args):
            try:
                value = float(feet.get())
                meters.set((0.3048 * value * 10000.0 + 0.5)/10000.0)
            except ValueError:
                pass
            
        root = Tk()
        root.title("Feet to Meters")
        
        mainframe = ttk.Frame(root, padding="3 3 12 12")
        mainframe.grid(column=0, row=0, sticky=(N, W, E, S))
        root.columnconfigure(0, weight=1)
        root.rowconfigure(0, weight=1)
        
        feet = StringVar()
        meters = StringVar()
        
        feet_entry = ttk.Entry(mainframe, width=7, textvariable=feet)
        feet_entry.grid(column=2, row=1, sticky=(W, E))
        
        ttk.Label(mainframe, textvariable=meters).grid(column=2, row=2, sticky=(W, E))
        ttk.Button(mainframe, text="Calculate", command=calculate).grid(column=3, row=3, sticky=W)
        
        ttk.Label(mainframe, text="feet").grid(column=3, row=1, sticky=W)
        ttk.Label(mainframe, text="is equivalent to").grid(column=1, row=2, sticky=E)
        ttk.Label(mainframe, text="meters").grid(column=3, row=2, sticky=W)
        
        for child in mainframe.winfo_children(): child.grid_configure(padx=5, pady=5)
        
        feet_entry.focus()
        root.bind('<Return>', calculate)
        
        root.mainloop()
        
        ~$ chmod 755 test.py
        ~$ test.py
        

        sieht exakt so aus wie jedes andere Programm auf meinem modernen System (Die Festerdekoration hab ich absichtlich so antik eingestellt.)

        1. Tach!

          Und da empfinde ich Python ein wenig problematisch, weil es sich recht wenig heimisch auf den Systemen anfühlt.

          Wie meinst Du das?

          Genau so wie du es eben gezeigt hast. Grafische Oberflächen imperativ zusammenbauen, ist nicht das, wie man sonst Windows-Programme erstellt. Und man braucht in dem Falle das Tk als Zwischenschicht.

          sieht exakt so aus wie jedes andere Programm auf meinem modernen System

          Kann ich anhand des Bildes nicht beurteilen, da ich kein vergleichbares Theme eingestellt habe.

          dedlfix.

          1. Grafische Oberflächen imperativ zusammenbauen, ist nicht das, wie man sonst Windows-Programme erstellt.

            Das stimmt. Mir gefällt die Vorgehensweise, dass man sich die GUI quasi malt und dann einfach Eventhandler an die Elemente bindet, auch sehr gut. Und ich kann berichten, dass Seminarteilnehmer an der Stelle erfreut staunen, wie einfach "programmieren" sein kann.

            1. Tach!

              Mir gefällt die Vorgehensweise, dass man sich die GUI quasi malt und dann einfach Eventhandler an die Elemente bindet, auch sehr gut. Und ich kann berichten, dass Seminarteilnehmer an der Stelle erfreut staunen, wie einfach "programmieren" sein kann.

              Einfach aber sehr aufwendig, wenn man das alles so ausführlich zu Fuß machen muss. Dann schon lieber WPF. Daran finde ich einfach, dass man eine schöne Trennung zwischen Oberfläche, Oberflächensteuerung und Geschäftslogik hinbekommen kann, wenn man nach MVVM vorgeht. Aber das soll hier eigentlich nicht das Thema sein, denn es soll nicht zu komplex für den Anfang werden. Die Einfachheit entsteht oftmals dass man sich das System insgesamt komplexer macht, aber die Teile untereinander einfach hält. Andererseits sehe ich das auch als interessant an, ältere Vorgehensweisen zu zeigen, damit man ein Gefühl dafür bekommt, warum die Entwicklung mittlerweile in eine bestimmte Richtung gegangen ist.

              dedlfix.

  4. Hello,

    jetzt lach bitte nicht.

    Ich selber habe mal mit XBase aka dBase angefangen. Das war maschinenfern genug, leicht verständlich und man konnte trotzdem sofort komplexe Aufgaben damit lösen.

    Der Übergang zu Turbopascal (als Compilersprache) und Assembler war dann der nächste einfache Schritt.

    Abgekotzt habe ich dann aber das erste Mal über die kryptischen Kurzschreibweisen und das Mischen von Code/Funktionalitäten und Daten in C und das dafür benötigte "Sonderwissen". Den Widerwillen dagegen habe auch bis heute nicht abgelegt.

    Ich stimme Dedlfix da zu: OOP kommt später fast von allein.

    Glück Auf
    Tom vom Berg

    --
    Es gibt nichts Gutes, außer man tut es!
    Das Leben selbst ist der Sinn.
    1. Hallo TS,

      warum lachen? Mit dBase bzw. Clipper habe ich von '88 bis ca '95 ebenfalls Brötchen verdient. Schön klassisch prozedural, mit ein paar OO-Erweiterungen, die Clipper ins Spiel brachte. Das war eine ziemlich gute Umgebung, solange man keine C/S DB brauchte.

      Danach musste ich Smalltalk machen. DAS war quälend. Angeblich durch seine völlige Objektorientierung total leicht zu lernen und die beste Sprache überhaupt. Aber frei von Performance. Und total schwer, es zum Anwender auszurollen.

      Seitdem bin ich bei C#. Commandline, WinForms, ASP.NET, Services - .net kann alles. Mit Java bin ich nie warm geworden.

      Zwischendurch gab's dann COBOL, C, C++ und als Hobby PHP und HTML/CSS/JS.

      Dass "OO von allein kommt", das kann ich aber nicht sagen. Man kann sich über Hybrid-Architekturen herantasten. Aber ein Programm mit reinrassiger OO-Architektur ist etwas ganz anderes, das muss man von Grund auf lernen und viele OO-Paradigmen erscheinen für jemanden, der prozedural groß geworden ist, erstmal völlig widersinnig.

      Rolf

      --
      sumpsi - posui - clusi
  5. Als Anwendungsfall haben wir / er sich ausgedacht, einen recht simplen Kalkulator zu entwickeln, der ihm (da Sportler) ausrechnet, wie sein average pace auf einer gelaufenen Strecke war. Also eigentlich ein Drei-Zeiler. Allerdings - und das wird für Anfänger wahrscheinlich ein wichtiges "Erfolgs/Begeisterungs"-Kriterium sein - sollten die Werte per UI eingegeben werden können.

    Nun das UI lass ihn mit HTML bauen und der Rest ist ein klarer Fall für JavaScript!

    Und wenns ein bischen mehr sein darf: Berechnung serverseitig.

    Vll. noch was über mich: Begonnen habe ich mit C. Aber so richtig begeistert hat mich erst ein Algorithmus zum Thema Kalenderberechnung, diese Macke bin ich nie wieder losgeworden 😉

    Und über C, dBase, Pascal, Delphi bin ich dann bei Perl gelandet. Meiner alten Liebe C bin ich jedoch immer treu geblieben.

    MfG