Skip Navigation

How should I continue learning?

I begun learning programming a few years ago, and it feels like I barely progressed. I know the basics and a bit of advanced python(I have learnt to use a few libraries), html and css plus a tiny bit of c++, but not much outside of those. I enjoy programming and solving problems using code, and it’s an enjoyable hobby of mine. But I feel like all I do is extremely basic and I want to advance but it feels overwhelming seeing the countless of things I could learn.

I wanna know what are ways I can actually apply the things I have learnt/will learn on somewhat worthwhile things, because the main problem right now is that I don’t really have anything to do with the things I’ve learnt other than silly projects that don’t really last more than a day and aren’t that complex. I also want to advance my knowledge as previously stated since I feel like I know too little for the amount of time I’ve been learning to program.

For context I’m still in school but not too far off from higher ed, and I have a decent amount of free time on most days(~2-4 hrs).

Thanks if you reply

34 comments
  • Its a tough problem. You have to find something that you want to exist; like an app or a website or a game. For example, try making a GUI for managing SSH keys. You know, like the ones github makes you create in order to clone and push to a repo. Make a visual representation of those keys (stored in the .ssh folder), and tools to add/delete them.

    Along the way you'll find tons of missing things, tools that should exist but don't. Those are the "real" projects that will really expand your capabilities as a developer.

    For example, I was coding in python and wanted to make a function that caches the output because the code was inherently slow.

    • but to cache an output we need to know the inputs are the same
    • hashes are good for this but lists can't be hashed with the built-in python hash function
    • we can make our own hash, but hashing a list that contains itself is hard
    • there is a solution for lists, but then hashing a set that contains itself is a serious problem (MUCH harder than hashing a list)
    • turns out hashing a set is the same problem as the graph-coloring problem (graph isomorphism)
    • suddenly I have a really deep understanding of recursive data structures all because I wanted to a function that caches its output.
  • This consternation is definitely common. It's hard to apply skills to something with no long term impact of benefit. I've improved my skills by finding stuff I can help on in the communities I participate in.

    It's natural to be overwhelmed, so deciding on a project does scope what you can learn, but a hard part is architecting the foundation of that project.

    Introducing new features to an existing project is a great way to get your feet wet - it has multiple benefits, for one of you do take a position as a developer in the future, you likely won't be architecting anything initially, primarily improving on existing projects. So participating in OSS projects is a similar mechanism to that - you have to learn their codebase to a degree, you have to learn their style and requirements, etc.

    Even if you don't ultimately contribute, it's still a learning experience.

  • To take up a career in programming is to be professionally confused on a day-to-day basis. It's normal to feel overwhelmed at times, but this is the advice I give younger engineers: accept that confusion, and try to channel it into curiosity instead of letting it fester into stress and anxiety.

  • It's a lot of work. I'm in a similar boat. I've been self teaching myself how to program in various languages and working as a Fullstack developer at a very small startup.

    While I've learned alot, there's always more to learn and finding direction is a challenge you'll hit many times over if you stick with it.

    Right now I'm reviewing various Open Source Projects I could contribute to as I know ultimately this will make me a much better developer. There are so many CLI and web development tools I use that I'd like to expand on but will require a marginal jump in my skills. Here are a few examples:

    • Add a feature to the rTorrent client that would allow it to torrent over i2p
    • Expand the amount of tools available within the SolidJS framework ecosystem to be competitive with React's ecosystem.
    • Create a HTTP server in Rust that has feature parity with Golang's Caddy
    • Add a feature to AntennaPod akin to YouTube Sponsor block that would allow for user contributed timestamps to facilitate auto skipping of ad mentions in podcast episodes.

    I also am slowly working out plans to learn enough about Rust and browsers to recreate the terminal based browser Links in Rust.

    But these are all just me spitballing. In truth, my skills aren't quite there yet and the amount of time to get there for each one of these is a lot. So I have to choose wisely and dive in deep on the project's codebase, probably for at least a year or more to make headway. But this is the mindset I think might help you. Look into the software you use a lot or like the concept of. Figure out how you'd like to improve it or add to it. Reach out to the developers of said software however you can, either make your case for the improvements you want to make or just help out on something they want to do with the software. Learn, listen. Rinse and repeat.

    Hope this helps a bit.

  • If you want to improve significantly, go read someone else's code and modify it. Try to fix a bug in a program you use, add a feature you want that doesn't exist already, or even just do something simple for the sake of proving to yourself that you can do it -- like compiling it from source and figuring out how to change some small snippet of text in a message box. Even if you don't succeed, if you put in a serious effort attempting it, you will almost certainly learn a lot from trying.

    Edit: changed wording to try to be clearer

  • Look at MIT and UC Berkeley's CS curricula and start tackling things that you haven't covered. They're both available freely online and you might still be able to find video recordings of Cal's lectures somewhere (they recorded every class for students who weren't present or had difficulty understanding in real time until 2015 or so but were hit with an ADA accessibility lawsuit because they weren't captioned or something.)

  • Read/Inspect and contribute to FOSS. They'll be bigger and longer lived than small, personal, and experimental projects.

    Study computer science.

    Work, preferably in an environment with mentors, and long-/continuously-maintained projects.

    Look at alternative approaches and ecosystems. Like .NET (very good docs and guidance), a functional programming language, Rust, or Web.

    That being said, you ask about "should", but I think if it's useful for personal utilities that's good enough as well. Depends on your interest, goals, wants, and where you want to go in the future.


    For me, managing my clan servers and website, reading online, and contributing to FOSS were my biggest contributors to learning and expertise.

  • Does your school have a robotics team or something along the lines of computing? That would be a good option. Also if you are still in high school and plan on going to college, you still have plenty of time to learn.

  • You can try to write programs you think would be a challenge for you (but still doable at your skill level). Write some games, bots that solve simple games like Tic Tac Toe or mods for your favourite (moddable) games. If you own a Raspberry Pi you could play around with the DPIO. Your free time projects are usually nothing too exciting or world-changing and that’s perfectly fine, they don’t have to be; the worthwhile part about them will be the practice they’ll offer.

    Alternatively, you could try reading some theory, learn different types of data structures, sorting algorithms or pathfinding algorithms and their respective strengths and weaknesses. Or go deeper and prepare for higher Edu in CS by looking into the maths fundamentals, learn some linear algebra, discrete math, analysis or basic graph theory, it will help you a lot.

    Edit: graph theory, not knot theory

  • You could try to find an open source project to contribute to? That'll get give you a nice big codebase to grapple with.

  • If you want that sweet dopamine hit of solving problem with out the overhead of doing a project just try leet code. Like that Chinese ping pong player. Nothing wrong with that if you are not gonna pursue it as a job. Ps. You can use different language then you are familiar with like Haskell or ocamel. It can really help you think differently and look problems in new light.

34 comments