Ask HN: What is the most challenging programming course you have taken?

64 points by hnthrow098767 ↗ HN
I want to improve my skills further so anything that's challenging and not limited to programming courses.

82 comments

[ 2.5 ms ] story [ 137 ms ] thread
I took an advanced perl class at the local JC back in 2003.
I would not call it challenging, but it was a fun and interesting experience. Learning functional programming through the CS 3110 course at Cornell University Here is the link: https://courses.cs.cornell.edu/cs3110/2021sp/textbook/

The OCaml part is free, well structured and does not take long to complete.

This class was so fun. I remember a lot of people did find it difficult too.
Computer Graphics back at Virginia Tech. No libraries, build the 3d yourself. I learned a lot in that class, including the fact that I did not want to make games for a living.
Well, doing it at that level is indeed quite tiresome.

When you move up a level or two, you'll see that making games can be pretty fun!

I guess the first one ?

A course being challenging is not a good indicator of its quality I think.

If you are searching for challenges, then whats the point of limiting yourself to school level?
I haven't graduated out of university yet.

I would appreciate anything that's challenging and helps me improve my programming skills.

Go for compilers then

It will significantly improve your understanding of programming langs, how some of them suck, what is possible, etc, etc.

It's not a course, but I definitely recommend the book "Deep C Secrets", I couldn't put it down, and had a similar feeling to being in a good, difficult, class.
Probably compiler class focused on the theory aspect of it.

It was much more interesting/useful the other compiler class I took which actually had me create a parser+compiler for a made-up language. Still somewhat challenging to think in that way, as it's not the usual way to process data.

Why was the theory more interesting?

I didnt enjoy it at all nor found it very useful, meanwhile practice was really useful and satisfying

I said that the practical was better for me. The theory killed me.
A Masters’-level security course at UT Austin. The first assignment was “implement AES and RSA from scratch, without Bignum, and on RISC-V in an emulator.” Just… why.

Spoiler, I did not succeed at that, but neither did most of the class.

For added "fun", if anyone succeeds you could then poke an oscilloscope at the thing and see if there's any obvious side-channel attacks. If there aren't, you get a magical exemption from the "never implement your own crypto" rule.
We did something similar back in the day, some 20 years ago, in an introductory course, although obviously not in RISC-V assembly.

It honestly strikes me as too trivial an exercise for masters-level.

The separate architecture put it over the edge for me, personally. I’m barely competent at C (especially back then) and may have been able to just manage had it been on native arch.

It did force me to get decent with bitshifts, which is always a useful skill. I found this [0] article about doing so with the 68000, and adapted it.

[0]: https://web.archive.org/web/20210225221011/https://www.atari...

The "in this arbitrary programming language we've never used before" was a common occurrence. At some point, we were given a PDF manual of some MIPS clone as well as a simulator.

In University, you were supposed to just pick these skills up all by yourself.

(comment deleted)
Cryptography in masters program of Moscow State University. Although it’s usually more challenging to learn something new before it reaches university courses…

Edit: noticed that it’s not just about programming. Then it’s complex analysis and theoretical physics at MIPT. Most computer science problems felt simple compared to that stuff.

My Numerical Methods class always felt just a bit beyond what my brain was capable of understanding. It was easily the most difficult course I had.
Ed Lamagna's "Algorithms and Data Structures" course at Univ. of Rhode Island.

I really had to work for that class, but the payoff was tremendous.

Out of curiosity, what textbooks did you use in that course?
IIRC, we used handouts that he photocopied from various sources. I don't think there was a textbook.
Logical programming (prolog).

I'm not sure I would call it the most challenging class, but it's the one where the most amount of people failed to learn anything. If I had to guess then 90% of the students (or more) ended up not being able to do anything with prolog.

I haven't seen any other class that had such an abysmally low rate of successful learning. I think the only knowledge most people took away from this class is to not use prolog.

I second this. One could say that advanced type-level programming is harder to understand, for sure, but in Prolog you can be lost at the very first step, feeling completely stupid for not being able to express the simplest thing (while already being very comfortable with C-style languages).
In my final semester of uni, we did an "AI" module, which involved using prolog. I didn't really grok it until the night before the final exam. Felt like I had a bit of a beautiful mind moment with all the possibilities opening up to me when it clicked.

This was my only 100% final exam module with no continuous assessment/midterm papers or exams/projects to pick up slack if I failed, so I was nervous going into it. Kinda felt like my whole degree weighed on it. That night before, I just *got it* and it made all the difference in the world. I got how powerful it is, and why to use it.

I haven't used prolog since.

> I want to improve my skills further

> Logical programming (prolog) ... but it's the one where the most amount of people failed to learn anything

I think the implication is that hnthrow098767 would like useful experience at the end of the course.

That being said: 25 years after my prolog course, and 21 years into my career, I wonder if I would take something away from it now.

Back in University the prolog class required us to pick a game and write a small "AI" opponent for this game in prolog.

Either people loved the whole different paradigm of logical programming and were really invested or they just didn't want to touch it. There wasn't much in-between.

I think it is great to expose people to different things and I loved it, but I agree for many people that sent prolog straight to their blacklist

Its one of those things thats very hard incrementally. I remember one of my assignments getting absolutely nowhere and then one day during my morning routine i suddenly knew the whole assignment and wrote it out in like a single minute.
I don't know how much this applies to other institutions, but speaking personally, my undergrad Operating Systems course very much threw the students to the wolves.

It wasn't one of those "memorize the textbook and you'll be fine" type of classes. It was a "do a bunch of independent research and figure a whole lot of things out for yourself" type of class.

Same here. After doing Java the entire first year, the second year we did a 6-hour course for C, and then had to write a ram-disk for a toy Linux operating system. We had to write the code, compile, boot in the new system, run a specific test suite, and repeat till the test passed. I am still not sure how we got the tests to pass, but I remember praying to the computer gods at one point, as well as a bunch of boot&hope development.
At my uni that class has ~30% passing rate depending on teacher.
Compiler Design. Dragon book and all. Learned a ton from that class
A course on abstract interpretation [1], taught by Radhia [2] and Patrick [2] Cousot at ENS in 1989. To my shame, I must admit that I didn't appreciate it at the time.

[1]: https://en.wikipedia.org/wiki/Abstract_interpretation

[2]: https://en.wikipedia.org/wiki/Radhia_Cousot

[3]: https://en.wikipedia.org/wiki/Patrick_Cousot

Very close to my experience, the most challenging course I had was "Semantics" during the 2nd year of Magistère. To this day I'm not sure I fully understand what I was taught during that course.
CSC265: Enriched Data Structures and Algorithms (UofT)
The title asks specifically for a programming course but the post text says not to limit to programming courses. It's a little confusing.

Programming is something you will get better at as you do it, so I wouldn't worry too much about it. Instead I would look for computer science courses that interest you and a course outside of comp sci that requires a lot of writing. Although technical writing is probably what you will be mostly doing, consider taking a creative writing or a critical reading course.

I edited the description after reading some replies here.I will try to improve on those aspects you have mentioned and on writing clearly. Thanks

edit: I wasn't looking for programming courses exactly but I thought they might suffice. I haven't graduated yet and I love to work on challenging stuff in my free time.

Finite Automata and the Theory of Computation.

Lots of Turing Machines and constructing proofs. I'm not sure I would have passed if it wasn't for my friend who worked with me on the homework.

AMIE?
> AMIE?

I think they mean 'Mon Ami'

got a book Low Level Programming by igor zhirkov. IT's not technically a course, but he wrote it for his teaching (his classes won a lot, a lot of prizes).

It's ofcourse, about low level programming, but since, the lower levels underpin the higher ones, for me the most useful thing was this book.

It was a super challenge for me personally (no degree in computing or anything), and working through it i felt more things click than any other resource i tapped into before. I feel i understand much better in any language now, what actually happens on the PC, and how to go about investigating what happens if i do not. (finding specifications, isa documents, documentation on interpreters of scripts etc. etc., learning to read code/sources.)

That being said, do you have a specific direction in which you want to improve? Because this obviously leans towards a specific flavor of programming, where it's maybe not as useful if you want a different flavor. I know many good/professional programmers who know nothing of this stuff and are really really good in their own domains.

I have some project ideas but they are too complex for me. I have domain knowledge but my programming skills are lacking + lots of ambiguity/confusion/uncertainty/fuziness while implementing.

I haven't delved into low level programming much but I will give it a shot. I do mostly scripting and automation - I want to improve my programming skills to the next level.

What 'type' of project ideas are this? don't need to share the idea, but in general: webapp,networkapp, desktopapp, does it have a GUI, is it a CLI tool, etc.

These different types will likely have very different learning paths and things for you to explore that will get you to a practical skill level in the areas you want quicker than going the assembly -> c -> c++ -> script engines route for example. This last one is really a long journey (to me atleast), and it will bare fruits only near the end unless you're into embedded stuff because hardly any apps these days are written in such languages (c++ being a bit more common).

I want to build a desktop gui app. Similar projects have 10000+ loc. It's math heavy and sometimes too complex for me while implementing. I haven't used chatgpt much because I wanted to improve my programming skills.
chatGPT is a bit like google or stackoverflow etc, but maybe more directed. Don't use it's code as it's nonsensical mostly, but it can definitely summarize well what directions to take.

Other then that, if it's math-heavy/complex, maybe start with parts. try to identify what you want to be libraries and core logic etc.

you could start by making a math library in C, maybe with some bindings to a higher lvl language you want to write the GUI code in. It will be quite a project in itself already, and once done, you have part of your goal completed.

Selecting, testing and experimenting with GUI code is also tricky. There's tons of different libraries out there. You can use existing, or even write openGL/Vulkan code and write your own. If cross-platformness is important, maybe look at things like .net maui etc. as it has that feature as a core feature.

Also, before writing anything, look into how to structure such large projects. Structuring your project will help in many ways, including deciding how to break up the project, where to start potentially etc. etc.

There's many ways that lead to rome, but most will be 'chunk it up untill the size of steps is so small you feel confident you can take a step, then take it'.

Feed your idea to ChatGPT and it can give you some basic ideas about what to learn.
In undergrad, Operating Systems was pretty challenging. (Duke)
My brain regularly explodes once it comes close enough to delimited continuations. I haven't even understood what a "prompt" is in that context.
In Computer Engineering, my most challenging course was “Communications Theory”.
As far as challenging goes:

Networking: Not really "difficult" concepts, but the teacher had a chip on his shoulder. The programming assignments were "fun challenging", and I think if the course was taught at a slower pace, it would have sunk in better.

Assembly: I personally didn't struggle too much, but a lot of the class did. My secret was that I had read a little bit about assembly programming in high school, and realized that I had to force myself to follow "structured programming patterns." (If true goto true else goto false.) (I also programmed with a lot of GOTOs as a kid, so I knew enough not to make a mess.) I remember showing one of my high-score assignments to another kid in class, it "clicked," and they told me that if they realized that they could make their code kinda look like normal structured code it would be much easier.

(Also, I forgot that I really, really struggled with the first assignment, which was to write "hello world" using the DOS debugger. That was the angriest I ever got in college.)

As far as "not limited to programming courses":

Foundations of Computer Science: This was difficult because of the professor. They really didn't click or empathize with the class. Most of the class was about regular expressions. They never made sense to me, so now I just have ChatGPT write them for me.

Compilers: I really, really enjoyed the homework, but again, difficult because of the professor. It basically picks up the theory from Foundations of Computer Science.

One thing I noticed was that theoretical CS classes at my school had professors who didn't really understand the students and their goals. Most of us were targeting software engineering careers: The professors would often get us lost in the theory and not bring it back to concrete terms.