Lately I've been learning Elixir. Many of the popular resources seem beginner-focused, which feels a bit tedious when you've been coding for over a decade. Are there any popular programming books or courses for more experienced coders?
There is a general lack of advanced materials in software engineering. This is one area where market economy works against common good, unfortunately. People who have the knowledge and want to capitalise on it are highly incentivised to preparing beginner level materials and maybe a tiny bit to prepare the something for people who already have a bit of knowledge. After that, the number of people who are your potential target drops off sharply and you would have to increase the price dramatically. And it happens that people will not buy a $200 book even if it had $100k worth knowledge in it.
There are some positions available though. For example, I recently found Let over Lambda by Doug Hoyte. Excellent book if you are that kind of programmer.
Another problem with advanced materials is that frequently people are even unable to recognise them as advanced or valuable. It is easy to look at and evaluate things you have experience with, it is much more difficult to impossible to do the same with stuff that is beyond your experience (also called The Blub Paradox: https://www.paulgraham.com/avg.html).
Personally, I just read a lot. I try to keep an open mind and even if I don't agree fully with the contents of the book, I try to use the ideas as inspirations for my own thinking. You can read codebases written by other people and learn new ideas. Over time, you gather a library of solutions to problems and knowledge of when to and when not to apply them.
If you do enough of it, you will find useful knowledge in unusual places.
I've taken 2 of David Beazley's courses.[1] And, I highly recommend them. If you haven't seen some of his talks, he's very good at explaining things by building them from nothing.
I took 2 courses: "Rafting Trip" and "Write a Compiler". Both were awesome. The Rafting Trip took us through implementing the Raft consensus algorithm from scratch. And the "Write a Compiler" course had us build a small language using LLVM.
Both courses (but especially the Rafting trip one) were definitely for experienced programmers. In the courses I took, people generally had at least 5 years of professional work. And even still, there were a few people that really struggled to stay on pace in the course.
But at the end, most people had a (kinda) working Raft library or compiler!
I enjoyed the "Rafting Trip" as well, side tracking a bit, anyone have course recommendation for ML ranking and ML recommendation courses or probabilistic data structures and algorithm (for example, bloom filter, Freivalds' algorithm that make multiplying matrix to O(n^2) etc.... etc)?
I came here to mention Dave Beazley's courses and talks.
In particular, I recently prepped/ran a week-long, in-house training session of Dave's Python-Mastery[1] course at my day job. We had a group of 8 with a mix of junior and senior Software Engineers and while the juniors were generally able to follow along, it really benefited the senior SEs most. It covers the whole language in such depth and detail that you really feel like you've explored every nook and cranny by the time you're done.
(I enjoyed teaching the class so much that I've considered offering my services teaching it on a consulting basis to other orgs. If that interests anyone, feel free to reach out to the email in my profile.)
Have taken two of his courses (Compiler and SICP) and highly recommend them. The only thing that is stopping me from taking more is I live at the other end of the world and have to stay awake the whole night for 5 days.
Hello, recently I've enjoyed Casey Muratori's Performance-Aware Programming course[0]. You could read Algorithms for Modern Hardware[1] to learn similar set of stuff though. Casey's course is aimed at bringing beginners all the way to a nearly-industry-leading understanding of performance issues while the book assumes a bit more knowledge, but I think a lot of people have trouble getting into this stuff using a book if they don't have related experience.
I've also found Hacker's Delight Second Edition[2] to be a useful reference, and I really wish that I would get around to reading What Every Programmer Should Know About Memory[3] in full, because I end up reading a bunch of other things[4] to learn stuff that's surely in there.
The Elixir one looks to me like a language reference. Nothing wrong with it, in fact I used to love "language reference" books in the 90s to learn a new language.
It's way better than the typical painful language tutorial that is teaching you about how a variable is like a box containing a value... for every new language you want to learn.
For the sake of other people knowledge, if you appreciate this format to learn a language from a book, search for "language reference" books. They are usually succinct and to the point.
This is something the computer security industry is great at [0][1] that the software industry really needs to catch up on. I would love a weekend to week long course on writing an SMT solver, building a 2D game, training a neural net on custom data, modern C++, peer to peer networking, integrating the lightning network into an app, building a darkweb application, etc. I have not seen many options for that.
Two free resources are Karpathy's neural net zero to hero [2] and Gamozolab's fuzz week [3]. Even just recordings of people who are top in their domain writing code are so useful.
When I want to take the next step with a new language, I usually find a popular or interesting framework/library for that language, and I do a deep dive into the codebase.
Set it up for local development, then step through calls with a debugger, look at the whole call/request lifecycle, start to tinker with the subsystems..
It's a great way to see the real-world usage of all the core concepts you've been introduced to in the intro/learning courses or tutorials, and be exposed to more advanced patterns.
For Elixir, the obvious choice would be Phoenix if you're on the web app side of things..
It's not Elixir, but I'm working through Jeremy Koppel's "Advanced Software Design Course". I've been coding for 22 years and it is definitely growing me.
Highly recommend it as well. I'm a junior developer; that course gave me a much better sense for how to design software and answered a lot of software engineering / design-related questions that had coming up over and over again. I'm also just really allergic to handwave-y fluff, and the Mirdin stuff is just so much more concrete and precise than, e.g., the 'clean code' software engineering advice I've seen on the interwebs.
When writing a small application in Go I had great success asking Chat GPT specific questions. It helped me figure out which packages I needed to use and how to interact with them.
I understand that this might not fit your use-case, but it's worth a try. Just be aware that it tends to hallucinate APIs.
Well it's not popular (even though it ought to be), but Edsger Dijkstra's A Discipline of Programming is an approachable and informal (by the author's standards) look at solving non-trivial problems in a provably correct way. In fact the entire EWD archive[1] can be arranged into a course pretty readily, although you'll definitely want to skim or skip large chunks of it. Also some of the papers are just acerbic observations on life, which some people like and some don't.
And there's it's big brother Predicate Calculus and Program Semantics by Dijkstra and Scholten that more rigorously formalizes the same approach.
Dafny[2] is one approach out of Microsoft Research that attempts to provide automated tooling around some of those concepts.
All of the above are excellent places to start if you're interested in learning how to write better code with the imperative languages that you're actually going to use professionally.
You can use Coq to teach yourself many of the same ideas from ADP using Penn's Software Foundations (probably the first two books are sufficient).
A somewhat more modern approach of related concepts to ewd's work is the work of Richard Bird which teaches you about using equational reasoning to take a correct naive algorithm and systematically optimize it into a correct and fast algorithm. [0] [1]
Regarding Dafny, there's actually a new book out that should be approachable to anyone with programming experience. [2]
The more advanced a book or course is, the less popular it can be. What are you looking for in a resource that you don’t get from the docs? Knowing that might help narrow down the recommendations.
If you’re already familiar with that, then take a look at the books from Pragmatic Bookshelf. They have quite a few books that cover different aspects of Elixir development including a recent ML-focused one: https://pragprog.com/categories/elixir-phoenix-and-otp/
I don’t have any general course recommendations but the strange loop conference videos have been the most inspiring for me. I hope to attend soon, and a life goal of mine is to have something interesting enough to present there.
For Elixir, Dave Thomas’ coding gnome “elixir for programmers” course skips all the menial BS about “what is a string” etc and goes right into the meat and potatoes of leveraging the language correctly. I loved it.
The obvious “next step” is experiential, i.e., write complicated programs. Books about writing compilers, databases, operating systems, emulators, file systems, etc. are all useful.
As others have said, expert-level material tend to not lend itself well to a book format.
Instead I find a lot of advance level knowledge is usually shared in tech blog posts and tech talks. The quality of these tends to vary a lot, so you need a bit of curation and due diligence. I myself found the videos from InfoQ very useful with 15 yoe (particularly in the software architecture track).
And if you want the really advanced stuff, you can also read papers. The barrier to entry is higher and sometimes is difficult to connect them to your everyday problems, but it doesn't get more cutting edge that than.
If you're learning Python, and know other programming languages, I have this online ebook [1] that I use with my students so that they learn Python fast enough so that I can teach them about socket programming.
Basically, in each chapter I give a small detailed introduction to the topic and then students do some exercises to solidify things.
I read this book years ago when i was first learning elixir. I was coding for about 8 years at the time, so not new to the game.
I liked it a lot. I don't think i wrote every project in the book, but it helped me wrap my head around OTP and how erland/elixir projects are structured.
There are no decent educational resources for experienced programmers (except books for narrow specific technical topics).
I know that from personal experience as an engineer and an educator.
There are strong economical reasons for that:
1. Experienced engineers can only learn something worthwhile from much more experienced ones
2. Extremely experienced engineers are rare kind on its own
3. Being a good teacher is a standalone set of skills and attitudes
4. It is extremely small set of intersection between being good engineer and a good teacher.
5. Courses from such people would cost a fortune to cover time and effort.
6. Experienced developers while being a paying audience, are at the same time extremely picky and hard to educate (because they already feel smart and know how to do things). Which makes situation even worse.
7. At the same time there are millions of noobs ready to consume almost anything you throw at them.
So imagine you are an engineer capable of teaching something. What would you do?
[+] [-] onetimeuse92304|2 years ago|reply
There are some positions available though. For example, I recently found Let over Lambda by Doug Hoyte. Excellent book if you are that kind of programmer.
Another problem with advanced materials is that frequently people are even unable to recognise them as advanced or valuable. It is easy to look at and evaluate things you have experience with, it is much more difficult to impossible to do the same with stuff that is beyond your experience (also called The Blub Paradox: https://www.paulgraham.com/avg.html).
Personally, I just read a lot. I try to keep an open mind and even if I don't agree fully with the contents of the book, I try to use the ideas as inspirations for my own thinking. You can read codebases written by other people and learn new ideas. Over time, you gather a library of solutions to problems and knowledge of when to and when not to apply them.
If you do enough of it, you will find useful knowledge in unusual places.
[+] [-] spicemonger|2 years ago|reply
I took 2 courses: "Rafting Trip" and "Write a Compiler". Both were awesome. The Rafting Trip took us through implementing the Raft consensus algorithm from scratch. And the "Write a Compiler" course had us build a small language using LLVM.
Both courses (but especially the Rafting trip one) were definitely for experienced programmers. In the courses I took, people generally had at least 5 years of professional work. And even still, there were a few people that really struggled to stay on pace in the course.
But at the end, most people had a (kinda) working Raft library or compiler!
[1] https://dabeaz.com/
[+] [-] pajep|2 years ago|reply
[+] [-] zenburnmyface|2 years ago|reply
[+] [-] notdonspaulding|2 years ago|reply
In particular, I recently prepped/ran a week-long, in-house training session of Dave's Python-Mastery[1] course at my day job. We had a group of 8 with a mix of junior and senior Software Engineers and while the juniors were generally able to follow along, it really benefited the senior SEs most. It covers the whole language in such depth and detail that you really feel like you've explored every nook and cranny by the time you're done.
[1] https://github.com/dabeaz-course/python-mastery/
(I enjoyed teaching the class so much that I've considered offering my services teaching it on a consulting basis to other orgs. If that interests anyone, feel free to reach out to the email in my profile.)
[+] [-] ayhanfuat|2 years ago|reply
[+] [-] zjmil|2 years ago|reply
[+] [-] TheAlchemist|2 years ago|reply
As you say, he is very good at explaining things - it's hard to describe, but it just clicks. Highly recommended.
I was a bit worried about the online aspect, but there is a very good flow actually.
[+] [-] yla92|2 years ago|reply
[+] [-] ilrwbwrkhv|2 years ago|reply
[+] [-] najmlion|2 years ago|reply
[+] [-] cvhashim04|2 years ago|reply
[+] [-] anonymoushn|2 years ago|reply
I've also found Hacker's Delight Second Edition[2] to be a useful reference, and I really wish that I would get around to reading What Every Programmer Should Know About Memory[3] in full, because I end up reading a bunch of other things[4] to learn stuff that's surely in there.
[0]: https://www.computerenhance.com/p/welcome-to-the-performance...
[1]: https://en.algorithmica.org/hpc/
[2]: https://github.com/lancetw/ebook-1/blob/80eccb7f59bf102586ba...
[3]: https://people.freebsd.org/~lstewart/articles/cpumemory.pdf
[4]: https://danluu.com/3c-conflict/
[+] [-] cobertos|2 years ago|reply
Usually I just use that site in addition to the official tutorial when a concept really stumps me.
Here's their article on Elixir[1]
[0]: https://learnxinyminutes.com
[1]: https://learnxinyminutes.com/docs/elixir/
[+] [-] xtracto|2 years ago|reply
It's way better than the typical painful language tutorial that is teaching you about how a variable is like a box containing a value... for every new language you want to learn.
For the sake of other people knowledge, if you appreciate this format to learn a language from a book, search for "language reference" books. They are usually succinct and to the point.
[+] [-] archsurface|2 years ago|reply
[+] [-] soultrees|2 years ago|reply
[+] [-] imjonse|2 years ago|reply
https://www.udacity.com/course/design-of-computer-programs--...
[+] [-] dpflan|2 years ago|reply
[+] [-] amykhar|2 years ago|reply
[+] [-] carom|2 years ago|reply
Two free resources are Karpathy's neural net zero to hero [2] and Gamozolab's fuzz week [3]. Even just recordings of people who are top in their domain writing code are so useful.
0. https://ringzer0.training/index.html
1. https://www.blackhat.com/tr-24/training/schedule/index.html
2. https://karpathy.ai/zero-to-hero.html
3. https://youtube.com/playlist?list=PLSkhUfcCXvqH2sgJa8_gnB41_...
[+] [-] sbarre|2 years ago|reply
Set it up for local development, then step through calls with a debugger, look at the whole call/request lifecycle, start to tinker with the subsystems..
It's a great way to see the real-world usage of all the core concepts you've been introduced to in the intro/learning courses or tutorials, and be exposed to more advanced patterns.
For Elixir, the obvious choice would be Phoenix if you're on the web app side of things..
[+] [-] sltr|2 years ago|reply
https://www.mirdin.com/
[+] [-] qwrshr|2 years ago|reply
[+] [-] tejohnso|2 years ago|reply
[+] [-] kilroy123|2 years ago|reply
[+] [-] sltr|2 years ago|reply
[+] [-] miguendes|2 years ago|reply
[+] [-] krilcebre|2 years ago|reply
[+] [-] __mp|2 years ago|reply
I understand that this might not fit your use-case, but it's worth a try. Just be aware that it tends to hallucinate APIs.
[+] [-] User23|2 years ago|reply
And there's it's big brother Predicate Calculus and Program Semantics by Dijkstra and Scholten that more rigorously formalizes the same approach.
Dafny[2] is one approach out of Microsoft Research that attempts to provide automated tooling around some of those concepts.
All of the above are excellent places to start if you're interested in learning how to write better code with the imperative languages that you're actually going to use professionally.
[1] https://www.cs.utexas.edu/users/EWD/
[2] https://dafny.org/
[+] [-] sn9|2 years ago|reply
A somewhat more modern approach of related concepts to ewd's work is the work of Richard Bird which teaches you about using equational reasoning to take a correct naive algorithm and systematically optimize it into a correct and fast algorithm. [0] [1]
Regarding Dafny, there's actually a new book out that should be approachable to anyone with programming experience. [2]
[0] https://www.cs.ox.ac.uk/publications/books/functional/
[1] https://www.cs.ox.ac.uk/publications/books/adwh/
[2] https://mitpress.mit.edu/9780262546232/program-proofs/
[+] [-] AlchemistCamp|2 years ago|reply
If you’re looking to understand what makes Elixir different from the most popular languages and how OTP works, I’d suggest Elixir in Action: https://www.manning.com/books/elixir-in-action-third-edition
If you’re already familiar with that, then take a look at the books from Pragmatic Bookshelf. They have quite a few books that cover different aspects of Elixir development including a recent ML-focused one: https://pragprog.com/categories/elixir-phoenix-and-otp/
[+] [-] whalesalad|2 years ago|reply
For Elixir, Dave Thomas’ coding gnome “elixir for programmers” course skips all the menial BS about “what is a string” etc and goes right into the meat and potatoes of leveraging the language correctly. I loved it.
[+] [-] __oh_es|2 years ago|reply
[+] [-] codewithcheese|2 years ago|reply
Retrospective https://www.youtube.com/watch?v=suv76aL0NrA
[+] [-] epiccoleman|2 years ago|reply
[+] [-] Q6T46nT668w6i3m|2 years ago|reply
[+] [-] whatamidoingyo|2 years ago|reply
[+] [-] eatonphil|2 years ago|reply
I have no affiliation with it I just love the idea and hope to see more like this.
https://www.dabeaz.com/courses.html
[+] [-] angarg12|2 years ago|reply
Instead I find a lot of advance level knowledge is usually shared in tech blog posts and tech talks. The quality of these tends to vary a lot, so you need a bit of curation and due diligence. I myself found the videos from InfoQ very useful with 15 yoe (particularly in the software architecture track).
And if you want the really advanced stuff, you can also read papers. The barrier to entry is higher and sometimes is difficult to connect them to your everyday problems, but it doesn't get more cutting edge that than.
[+] [-] enduku|2 years ago|reply
[0] https://self-service.mirdin.com/products/advanced-software-d...
[+] [-] jventura|2 years ago|reply
Basically, in each chapter I give a small detailed introduction to the topic and then students do some exercises to solidify things.
[1] https://github.com/joaoventura/full-speed-python
[+] [-] dartos|2 years ago|reply
I read this book years ago when i was first learning elixir. I was coding for about 8 years at the time, so not new to the game.
I liked it a lot. I don't think i wrote every project in the book, but it helped me wrap my head around OTP and how erland/elixir projects are structured.
Highly recommend it.
[+] [-] bentanweihao|2 years ago|reply
[+] [-] aristofun|2 years ago|reply
I know that from personal experience as an engineer and an educator.
There are strong economical reasons for that:
1. Experienced engineers can only learn something worthwhile from much more experienced ones
2. Extremely experienced engineers are rare kind on its own
3. Being a good teacher is a standalone set of skills and attitudes
4. It is extremely small set of intersection between being good engineer and a good teacher.
5. Courses from such people would cost a fortune to cover time and effort.
6. Experienced developers while being a paying audience, are at the same time extremely picky and hard to educate (because they already feel smart and know how to do things). Which makes situation even worse.
7. At the same time there are millions of noobs ready to consume almost anything you throw at them.
So imagine you are an engineer capable of teaching something. What would you do?
[+] [-] dceddia|2 years ago|reply
For learning about performance and low level stuff, Casey Muratori’s Performance Aware Programming course has been great. https://computerenhance.com
For higher level software design stuff (beyond just GoF patterns), check out James Koppel’s writing at https://www.pathsensitive.com/ and his courses at https://mirdin.com