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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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'.
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.
82 comments
[ 2.5 ms ] story [ 137 ms ] threadhttps://cryptopals.com/
https://sarabander.github.io/sicp/
The OCaml part is free, well structured and does not take long to complete.
When you move up a level or two, you'll see that making games can be pretty fun!
A course being challenging is not a good indicator of its quality I think.
I would appreciate anything that's challenging and helps me improve my programming skills.
It will significantly improve your understanding of programming langs, how some of them suck, what is possible, etc, etc.
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.
I didnt enjoy it at all nor found it very useful, meanwhile practice was really useful and satisfying
Spoiler, I did not succeed at that, but neither did most of the class.
It honestly strikes me as too trivial an exercise for masters-level.
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...
In University, you were supposed to just pick these skills up all by yourself.
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.
I really had to work for that class, but the payoff was tremendous.
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.
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.
> 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.
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
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.
[1]: https://en.wikipedia.org/wiki/Abstract_interpretation
[2]: https://en.wikipedia.org/wiki/Radhia_Cousot
[3]: https://en.wikipedia.org/wiki/Patrick_Cousot
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.
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.
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.
I think they mean 'Mon Ami'
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 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.
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).
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'.
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.