People learn differently, there's no doubt about that. I for one, have never been able to follow a lecture. No matter how interesting the subject might be, the teacher or professor either moves too slowly or too quickly, and in both cases I lose the motivation to study and learn outside of class. Looking back at all my past lectures, this is a bit of a shame. I genuinely love learning! In fact, nowadays there's nothing I enjoy more than poring through the ArXiv, looking for the latest and greatest algorithms in physics and computer science. Sure, I cannot understand them all, but sometimes it's nice to be completely overwhelmed and chip away at problems one piece at a time. In the end, modern research is a conglomeration of fun little (or big) puzzles to solve; however, I find that many papers are too harsh for most people to tackle without a significant background in computer science or physics. For this reason, they are ignored by the public. We live in an era where nearly the entire sum of human knowledge is available at our fingertips, and yet people are blissfully unaware of the unique ideas and challenges that are pushing our understanding forward.
I guess that is the point of this work. Throughout the past few years, I have been collecting small morsels of knowledge that are hard to express in any meaningful way through blog posts, YouTube, or twitch streaming. YouTube, for example, is a great place to introduce the general idea of an algorithm; however, I personally find it a poor choice to show a worked example. Twitch is great to show everything, but spending 5 hours programming up an algorithm for the first time is generally not everyone's idea of fun. Blog posts work well for this type of material; however, they lack a comprehensive nature that I tend to enjoy. So what's left? Well, I suppose that would be a book, which is an incredibly exciting prospect!
See, when I was younger, maybe around Jr. High School age, I really wanted to become an author. I spent as much free time as I could manage writing fantastical stories about heroes and villains creating their own worlds and redefining reality. It was (and still is) an enjoyable hobby of mine. In many ways, my love of storytelling is echoed in my love of science and mathematics. In my mind, every discovery is its own story -- an adventure just waiting to be understood! It seems incredible to me that I now have the chance to combine my two favorite hobbies: writing and learning.
Now, to be clear, I am not a master computer scientist. In fact, my degree is in physics and at the time of writing, I am in a PhD program studying quantum systems; however, I really, really love learning algorithms. About a year or two ago, I started a Twitch stream focused on computational physics. Almost every day, I would get up at 5:00AM and livecode something I had never coded before. It was incredibly fun and through working with the community, we learned a lot. In addition, I found my programming abilities improving significantly, and I learned to see the power in a community of hobby programmers.
This text is a natural extension of that idea -- a community effort to learn as much as possible about as many algorithms as we can. Because of this, I feel like I should be as honest as possible about the nature of this book. As mentioned, I am not classically trained in computer science, so for the most part, I will be learning right along with you, the reader. My hope is to advance my own understanding of computer science while also providing a comprehensive guide for those wishing to improve their own understanding as well.
For this reason, I hesitate to call this a work a "textbook" and would prefer to think of it as a lab notebook of sorts. It will be an archive filled with cool ideas in computer science and physics that I hope will be interesting in their own right. My hope is that this book perfectly straddles the line between comprehensiveness and pleasure and will be an enjoyable read for anyone at any stage on their hobby programming journey.
Keeping with the community theme, this book is freely available on GitHub and GitHub pages. Please feel free to read / browse the content available there. If you have any questions / comments / concerns, please let me know. This book is a community project and will only work if there is a community that works on it!
As a final note before beginning the bulk text, I would like for this book to be "language agnostic." This basically means that I would like to use pseudocode in the main text, but provide source code in any language you could want in the appendix. Though this may seem a little counter-intuitive, I think it offers the greatest flexibility for myself as the author and for the community to develop their own code in any way they please. In fact, if you feel inclined, please feel free to implement your own version of any algorithm mentioned in this text. If you submit it and it passes all my ahem rigorous tests, then I can throw it at the end of each chapter with attribution to you!
So I guess that's all for now. Because this book is freely available online, I may be heavily modifying the content as we delve deeper into the archive of arcane algorithms.
The code examples are licensed under the MIT license (found in LICENSE.md).
The text of this chapter was written by James Schloss and is licensed under the Creative Commons Attribution-ShareAlike 4.0 International License.
After initial licensing (#560), the following pull requests have modified the text or graphics of this chapter: