As you can tell from the blog's name, my current goal in life is to become a Jedi. Lately I've spent a lot of time thinking about what's next on my list, and that led me to realisation that I don't have no list.
This is a personal post that I am mostly writing for my future reference. Feel free to skip it.
What's a Jedi?
Most people think of Jedis as of those guys with the lightsabers from the Star Wars movies. But this post isn't about them, and it is not even about Jediism. I am refering to a term that my father and his friends are using to call genius software engineers who's work is borderline magic (Force).
I have to give you a small historical background. My dad used to work on a computer with proprietary architecture as a student in 80's. I don't remember this, of course, since the project actually completed by the time I was born. However, I am lucky enough to know some of the talented people who were a part of it. Most developers I know would call these people geniuses, even though they don't think that of themselves.
I am not going to retell you all the stories I've heard as a child here. What I'm trying to say is, I've been raised by a man who by these days is capable of reading assembly and fix issues in compilers that were brought in by kernel changes in Linux. And he's not even an engineer anymore! His diploma was a check disk utility for Kronos, as far as I recall.
Unfortunately, as a child I have not been interested in this enough and didn't learn too much from my dad. Now I'm not living with my parents anymore, and I'm curious. I desperately want to know all those basic things, like assembler, OS architecture, compiler internals. I have some sporadic knowledge, of course: I have some idea of how to read assembly, and I had a course on OS and on compilers. But I am not nearly proficient in this, and currently am not capable of developing my own computer.
This should be good enough for you to understand what a Jedi is to me.
Another thing I'd like to add is that Jediism as I see it is not only about computers. It's about knowledge, it's about utility and ability to adapt. These are things that I value a lot, and I use this as my personal self-improvement metrics.
To conclude, let me give you my personal definition of a Jedi. To me, a Jedi is someone who is good at many things, and can become good at other things if this becomes necessary. Surely this is not formal at all, but you should be able to understand the basic idea behind this. To be a Jedi, you'd need to be wise, clever, be a generalist while being particularly good at your speciality, and be capable of learning.
Where I am now
So now that we know where I wanna be next, let's take a look at where am I now. I'm 23, I have a Masters in applied mathematics, I live in Paris and have a Russian passport. I have two years of experience in Objective-C and iOS development and some hands-on experience with Swift and Java, as well as a bit of knowledge of compilers. I also know some algorithms, but have never actually taken any CS courses (as we didn't have any on Maths department).
What do I want to do (and know)
This part is basically the reason I am writing this post at all. This is a list with no particular order.
development-related
- develop an own multi-process OS
- develop an own compiler
- learn to understand assembly
- learn backend development basics
- learn Android basics
- learn Mac OS development basics
- write a 3D game on OpenGL
- learn functional programming
- beat the classical programming books
- understand C++
other
- learn French
- learn Economics
- learn English grammar
I want to go through this, item-by-item, and explain myself on each one.
First three(OS, compiler and asm) are simple. My father used to work with this, and I want to be on the same page as he is. I always wanted to, and I know I am capable of this (I was born with enough midi-chlorians). I feel like understanding assembly is directly derived from the first two items. I would feel like my compiler experience is sufficient once I have a compiler that can build itself. I have little idea on how to convince myself that my OS is good enough, but I feel like I'll know this once I start going towards this goal.
Backend development basics. I really want to understand what is it like to develop a backend, and what challenges are my coworkers going through while I am dealing with their Error 500s. The acceptance criteria for this would be to develop a small backend for some of my personal project or something.
Android basics is very straightforward — I'd love to know more about this platform since it's an iOS' rival. I feel like this would make me better as a mobile developer, making me a better person after all. I think that writing a client-server application with some data persistence and some cool UI effects would be a cool way to cross this one.
Mac OS development basics should be close to iOS development. With iOS I've kick-started my learning with a Stanford course on iTunes U which had a systematic approach, a great instructor and is overall brilliant. I recommend it to everyone who wants to learn to write iOS apps. Even though I've done several desktop projects for myself, I never actually went too far. I really want to try interprocess communications, several windows utilization and other desktop-class features of Mac OS one day. I think I will be satisfied with a Mac app with a demon process.
A 3D game is something I've wanted to try since I was a little kid. It may surprise a few of my friends, but I never actually made a spinning cube (or triangle) on OpenGL. I have a very vague idea of how this works. I've learnt some things about GPU architecture in university, and I want to put my hands on this one day. Game development (particularly AI) is another aspect of this that I only have some basic knowledge of. I think that a 3D tic-tac-toe or a similar simple game would be a cool project to cross this out the list.
Functional programming. I am writing some Reactive Cocoa code and have a good grasp over some basic concepts like signals and streams as well as some academic knowledge of lambda-calculus but I always wanted to do better. I want to read a few books on FRP and learn Haskell. No particular acceptance criteria here.
Classical programming books. There are many a book that I always wanted to properly beat. You know, completing all the excercises, understaning every little detail. Those obviously include TAOCP, A Discipline of Programming and many other on algorithms, translators and so on. I'll feel proud of myself once I'll finish anything that my dad and his friends throw at me. It's not that much, really: they only had so many books in 80's.
Understand C++. Don't get me wrong — I can read C++ code, even though I don't like it at all. I really want to spend some time reading books about it and writing some actual C++ code so that I understand how the language evolved and why is it still important now. I am very sceptic about it: I feel like modern languages are much more convenient, and C is more suitable for highest performance, so why bother? Obviously there is a reason to love C++, as many people do, and I want to understand it one day.
Learning French was one of my goals when I moved to Paris. I never did. I hope I will though, even if I'll leave France forever one day. I will consider this mission complete once I understand what all those people on the street are talking about.
Basic Economics is something I want to know because my mom learnt economics and my girlfriend is getting her Masters in Economics this year. All my life I've heard a lot of economic terms and I have very little understanding of the matter. I want to know at least the very basics of micro- and macroeconomics, finances and basic tax info about US, UK, EU and Russia to clearly understand my friends and random internet folks on reddit.
English grammar concludes my list. This is something that my girlfriend inspired me to learn: she has a Certificatie of Proficiency in English and corrects me all the time. She knows some incredible things (one does not say "prefer something", instead it must be "prefer something to something else"), but most of the time I feel a bit miserable when she finds me wrong: I used to be very good at English at school. I want to be able to write a blog post and have no problem showing it to her once again. Ideally I'd pass CPE myself, but this means wasting a huge amount of time preparing for the test itself.
Will this make me a Jedi? Most probably no. I am sure I'll find a lot more things to learn throughout my life. It's true that I'm a member of a Generation of Lifelong Learners, and the world never ceases to impress and bring some excitement to my life.
How to achieve this?
As you can see, my goals really are quite simple. To complete them I would need a library, a computer, and a lot of free time. Thanks to Coursera, Khan Academy, iTunes U, Wikipedia, open-source community and the Internet itself, one truly is the master of his own destiny.
You would probably think: why would you even write this then? Just go and study, lad!
The problem is, I don't have any resources for that right now. I am very limited in time and money, and I don't even have a writing desk at my apartment. I spend most of my time at work.
Luckily, I still do have my weekends. I'm taking a few CS courses on Coursera, and an Android one just started, so I'm going to cross some items off the list pretty soon. I'm also coming to visit my parents and have some high hopes about reuniting with my father.
Instead of an epilogue
Here are my plans for the next few years. I have no idea wether or not I am going to complete at least half of those and how my ideas are going to change with time. But from now on, I have the List to refer to when I'm in doubt.
It is also very exciting to write my first truly personal post. I feel relieved after expressing all these ideas that are bothering me for such a long time.
Congratulations if you made it through this wall of text. Thank you. Seriously.