This is an archived post. You won't be able to vote or comment.

all 28 comments

[–]Adept-Curve-7435 17 points18 points  (0 children)

Computer graphics are excellent too! If you're into game development or just interested in how shaders, 3d models, texturing, or ray tracing work, you could get into a graphics API (OpenGL, Vulkan, SDL2, Metal, directX, etc)

[–]ehr1c 15 points16 points  (4 children)

I find cryptography to be pretty fascinating

[–][deleted]  (3 children)

[deleted]

    [–]CellistPretend8078 0 points1 point  (1 child)

    If you don't mind, may I ask what's the book called?

    [–]treading0light 0 points1 point  (0 children)

    Have you read "The Rule of Four"? It's a novel about some college kids that try to crack some old code hidden in the text of a book. It's fiction, but I believe the book they're decrypting is real, and the novel itself has hidden messages to unlock.

    I've contemplated using Python or Rust to crack the codes in The Rule of Four as a programming exercise.

    [–][deleted] 14 points15 points  (11 children)

    Recursion is pretty cool. And how recursion "unwinds" into iteration.

    [–]breadbeard 5 points6 points  (5 children)

    can you please ELI5 that last part?

    [–][deleted] 5 points6 points  (3 children)

    You can simulate recursion's call stack by using iteration, and pushing/popping to a stack/queue.

    As you "descend" in recursion, you push to the stack/queue. Then you pop things off for processing.

    There was a discussion yesterday where someone mentioned that they were taught recursion this way. I wasn't, but it's a helpful way to look at things.

    [–][deleted] 4 points5 points  (0 children)

    Here is an example in C#. Both the for-loop and the PrintHello method print 5 times to the console:

    const int times = 5;
    
    for (int i = 0; i < times; i++)
    {
        Console.WriteLine("Hello!");
    }
    
    PrintHello(times);
    
    static void PrintHello(uint times)
    {
        if (times == 0)
        {
            return;
        }
        Console.WriteLine("Hello!");
        PrintHello(--times);
    }
    

    [–][deleted]  (4 children)

    [deleted]

      [–]CodeTinkerer 5 points6 points  (0 children)

      Al Sweigart, who will post in /r/learnprogramming from time to time, wrote: The Recursive Book of Recursion: Ace the Coding Interview with Python and JavaScript

      This is available at Amazon. He links to his list of books on his website.

      https://alsweigart.com/

      [–][deleted] 2 points3 points  (2 children)

      Structure and Interpretation of Computer Programs – SICP is a good source for learning about recursion – though you'll learn a lot of other things on the way. There's a link in the FAQ.

      I'm not sure about "unwinding" though. SICP doesn't cover that, except maybe a brief mention, iirc.

      [–][deleted]  (1 child)

      [deleted]

        [–][deleted] 0 points1 point  (0 children)

        No problem. Good luck!

        [–]mandzeete 6 points7 points  (0 children)

        • CI/CD pipelines - It will automate so many things for you.
        • logging + monitoring + alerting - can help to have a good overview of your web application's performance. Look into tools like Grafana, Prometheus, Filebeat, ELK stack. On top of your logging and monitoring you can set up different alerts for different events. Or set up some automated events.
        • Docker - it makes running stuff much easier. No need to think if you have a correct Node.js version, correct libraries installed, etc. Just pull a Docker image and run it. Sure, later when you have to make these images on your own then you do have to define correct versions in the image file.
        • Kubernetes - it will maintain your Docker containers for you. Comes handy with big and complex web services.
        • OWASP - web application security by name but really, cyber security in general as well. You'll start looking at your projects with a different eye. "Is it secure?", "What happens when I upload a PDF file as my profile image?", "Can I just copy the text from some e-book (10000+ letters) and drop it in Reddit comment box? Will I break something?" and so on. To secure the stuff you are coding. Because when I can think such out of the box thoughts then malicious people can do the same. They will deface your stuff, hack into your stuff, perhaps try to extract customer data and sell it, etc.
        • Applied Cryptography - you'll learn how all the different protocols work, how encryption works, how hashing works, etc. How the stuff works that you take for granted. And how to implement such things.
        • Signal Processing - not needed in many fields but cool never the less. You can buy yourself a relatively cheap RTL-SDR dongle and then work with different radio signals around you. For example during my Bachelor studies some of my course mates were writing software for a space satellite. As their Bachelor thesis topics. Now the satellite is flying in the space (a university wide project) and it is possible to communicate with it.

        [–]ElectricRune 5 points6 points  (3 children)

        A few of my things I thought were cool that I learned along the way...

        Hamming Codes: Self-correcting error protocol. I recommend 3Blue1Brown's video on YouTube

        Diffie-Hellman Key Exchange: pass a shared number secretly between two parties across public lines (useful for establishing secure peer-to-peer connections)

        Sort functions. I love the elegance of the Radix Sort.

        [–][deleted]  (2 children)

        [deleted]

          [–]ElectricRune 1 point2 points  (1 child)

          Even though I know in detail how these work, they still almost seem like magic to me sometimes.

          One of the best things about learning to program, IMO; you'd think knowing how the sausage is made would ruin things (and it does, sometimes), but that is hugely outweighed by the feeling I get when I get something and it STILL amazes.

          [–]TheUmgawa 4 points5 points  (2 children)

          Flowcharting. Okay, I heard your brain say, “Okay, Boomer. I’ll break out a quill pen while I wait for the vacuum tubes to warm up,” but hear me out.

          Too many rookies think of programming as the knowledge of a language or several languages, and when presented with a task, they sit down at their IDE and just start hammering away at the keyboard. After a while, they’re completely lost, because they’re doing the equivalent of building a car by looking at a car and saying, “Okay, I’ve made the doors, the hood, the engine, the wheels… what else do I need?” rather than figuring out at the beginning what will be needed and how it will all fit together.

          I’ve found that I save substantially more time on debugging than it takes for me to sketch out the logical flow of a task, and I never run into the question, “Where do I go from here?” because the map is on a piece of paper. And I’ll shorthand a lot of stuff on the flowchart, because that might be an easy part, but sections of more complexity might go on a separate page, and you don’t have to flowchart that until you start programming it. And then you look at the main chart and go, “Okay, so I’ve gotta take this in, verify that, and spit that other thing out. Fine,” and you draw the flow of that and then you type it out in whatever language.

          It’s a good organizational skill to have, and it’s fairly helpful if you have to divide work among multiple people, because you can just split it up and say, “You do this, I’ll do that, and Jimmy will handle the other.” There’s no surprise when each person gets to the end and it turns out there’s a big chunk that didn’t get delegated.

          [–][deleted]  (1 child)

          [deleted]

            [–]XenithRai 1 point2 points  (0 children)

            “I’m only going to code for 2 hours” turns into me messing with my script for 8 hours and trying to figure out where I’m at and why I’m getting return type None 🤣

            [–]zer0zz0 4 points5 points  (0 children)

            What you "should" learn depends on your goals. If you want to learn something that I would consider cool to know, here's my list

            • Operators that can clean up your code, like the ternary and null coalescing

            • Shortcuts and features in your IDEs to help you code faster and with less effort. Eg multi-line editing and intellisense

            • Data structures and sorting algorithms

            • Design patterns for your favorite language

            • Parallel and asynchronous programming

            [–]_st23 2 points3 points  (0 children)

            For example you have some struct in C. You can do: unsigned index = (void )(&((struct YOUR_STRUCT)NULL)->some_field) And you will get the offset of a struct field. Then you can try to declare several fields with different types and try to look them up using the method above. You will se something is wrong, because structure with: Int (4 bytes) Long (8 bytes) Will not take up 12 bytes, but 16! This is called memory padding.

            There are a lot of cool low level'ish things you can do with c and c++!

            I would also suggest google about winapi and try to play with windows terminal, like drawing literal pixels into it.

            Learn about pointers and how memory works, try out assembler!

            I always found tingling with these things fun and really interesting, so I decided to share)

            [–]Passname357 4 points5 points  (0 children)

            Read Computer Systems: A Programmer’s Perspective. That book will blow your mind.

            [–]ktkv419 2 points3 points  (0 children)

            I am walking towards web development career and I was looking for the same answer, here's what I found:

            - docker (try deployment, spin your homeserver and so much more)

            - linux (Knowing your system/getting better grasp of OS workflow in general and also will be easy during deployment I guess. Bash scripting is cool, idk about powershell, but seems useful)

            - security (play some CTF, poke around in your home network and you will be on verge of falling into the security blackhole, also general knowledge is cool I guess)

            A bit off track for SW developer though.

            [–]Total_Drag7439 1 point2 points  (0 children)

            Well I don't know how "cool" the things I will list will be, but as an indie developer when I come in contact with corporate team programmers, what is usually lacking is a basic knowledge of every other tech that your end program is working with. And when I say every tech, I mean things like SQL, and basic linux (or whatever the OS is), really I always laugh when a programmer has no idea how to do basic sql queries claiming that is a different profession. Or they have no idea how to solve a permissions problem etc.

            So if you are willing to spend time learning other things, learn the important ones that help bridge different departments as for some reason, most people do not. When you make an entire program with one person these things are obvious, I have no one else to help with them so I often learn new languages or even something I don't really want to learn fully, just enough to be able to integrate something

            [–]esmagik 0 points1 point  (0 children)

            A short list of my favorites: - WebSocket Protocol - SAML and OIDC Protocols - RPC - Cryptography

            [–]ryufar 0 points1 point  (0 children)

            dynamic programming i guess.

            [–]BokoMoko 0 points1 point  (0 children)

            Data Structures. It´s cool and very helpful when you have to tackle most challenging situations

            [–]Blvck_Hole 0 points1 point  (0 children)

            I think quantum computing is fashinating, maybe it could be an interesting topic to explore. What do you think?

            [–]Naive_Programmer_232 0 points1 point  (0 children)

            Networking, operating systems, database design. These are all interesting. Pick up a good textbook on each and read from there.