I learned this past year that I have a weakness. My weakness is my desire to learn. I want to learn everything. I want to understand everything at the lowest level possible. I am not satisfied unless I 100% understand a concept. It is a blessing and a curse. A blessing because I will come out with a thorough knowledge of a concept but a curse because it will take much longer to go through all the necessary (and sometimes unnecessary) components of a concept. This fact led me to restart my education a number of times; starting from scratch to round out my knowledge. This is my first year (and 3 months) of self-study.
I started with Swift. The first month was spent trying to understand what programming entailed. I did not know how to think like a programmer and I didn’t know where to start. I had few friends who programmed and didn’t have much of a place to start. I decided to start with Swift because I had an iPhone. During this month I learned the major and most common ideas that are common to most programming languages. I learned what common data types existed in Swift, and how to assign them to variables and constants. I learned about control flow, loops and conditionals. I learned everything they teach in the first week of an intro to computer science course. I learned about Xcode and watched tutorials online and followed along, not really absorbing anything. After a month I had learned a ton of definitions but was at a complete loss at how any of these ideas could be combined and how they could be used to create a program. The resources I used, although were very well created, were not appropriate to someone at my level. I needed a new game plan.
Concepts: Data Types, Conditionals, Loops
After a month of study without really understanding any fundamentals I decided I needed much more structure. I found a course offered by Stanford which provided just that. The course was CS106a: Programming Methodology. Throughout the course of 24 lectures, the amazing Professor Mehran Sahami teaches the fundamentals of programming, starting with a very basic language named Karel which consisted of only 4 built-in methods to introduce the bare concepts, and then moving quickly into Java for the rest of the course.
The course was the answer to my prayers. It was structured. It offered easy to follow and engaging lectures. There was an accompanying text book (The Art and Science of Java: An Introduction to Computer Science) which I read in its entirety, inhaling all it had to offer. There were homework assignments that I completed in Java and are featured on my Github profile. In the span of 2 months I worked through every problem and completed them to the best of my ability.
My only qualm about the course is that the lectures available to the public are outdated. I believe they were filmed in ~2007. This was a bit of an issue, as some parts of the language were outdated, but the overall methodologies that the course teaches have not changed. When I finished the course I felt way more comfortable with understanding how programming worked. If anything, I learned how to think like a programmer.
Languages: Karel, Java
Concepts: Expressions, Control Flow, Methods, Objects and Classes, Object-Oriented Programming, String and Characters (enumeration, built in methods), Pointers, Arrays, Basic Data Structures, Searching and Sorting Algorithms
These next few months were an interesting time for me. I moved from Toronto to Vancouver, I travelled to China for a wedding, and I began living with my girlfriend (and her family). There are a number of times throughout this year that I took a break from programming and studying. Breaks are important. They can cause some anxiety at first when you think about all the time that you could be using to study but giving time for the material you learned to sink in can be more beneficial in the long run. I took about 2-3 weeks off at this time while I moved, settled in, and travelled.
Once I felt a bit more comfortable with my new city, I reviewed what I had recently learned from CS106a and planned my next steps. I had found another Stanford course during my first month of study that I had started and quickly stopped because I was completely lost. The course requires background knowledge of programming and specifically object-oriented programming. With my experience in CS106a I felt comfortable beginning this new course: CS193p iPhone Application Development, taught by Professor Paul Hegarty.
CS193p is challenging. There are 17 lectures and they are about an hour and 20-30 minutes each. Each lecture took me at least twice the time given to watch. I had to re-listen to some parts multiple times in order to grasp what was going on. The homework assignments were extremely difficult as well. The assigned reading were the swift docs and the Apple Developer Documentation. These were no easy reads for someone who had started to learn how to code only less than half a year earlier.
To complement this course and to ease me into swift a little slower, I signed up for a Udemy course named iOS 10 & Swift 3: From Beginner to Paid Professional. This course, taught by Mark Price introduced the language and the frameworks more gently. I was able to skip the first few sections because of CS193p but found that rewatching certain videos aided me on my journey.
Both courses complimented each other well and I would recommend them both. I liked the detailed tutorials introduced in the Udemy course and appreciated Mark Hegarty’s in-depth and deep knowledge of Swift and the Apple Developer Documentation. He really knows everything there is to know about iOS development. My greatest accomplishment was taking what I knew about JSON, and queues and building a weather app that downloaded weather information from an API and updated an app (again see my Github page). It was my greatest accomplishment from the course because not only was I able to implement the app using AlamoFire, an HTTP networking library, but also, and foremost because I was able to implement it without using AlamoFire. I managed to download and parse the JSON data on my own without using any outside library. That was a really great feeling. I felt very comfortable working with Swift and programming after both of these course.
Concepts: The most important concept I learned was how to read language docs, frameworks, apis, and libraries. Xcode, MVC, Apple Developer Documentation (Appkit, Foundation, Core Data, Core Location, etc…), HTTP, JSON, Git
After 6 months of studying I was beginning to feel comfortable with my learning. At this time I took a job as a substitute French Teacher with the Richmond School District. It was September and a new school year was starting. I felt comfortable with programming but I wasn’t extremely confident (this has to do with my desire to 100% understand everything – my weakness and my strength). This is when I started to think about little details I might have missed and wanted to go back and start from scratch. I wasn’t satisfied being just comfortable with programming, I wanted to be very competent. I began to look at University Computer Science programs and what they offered and courses students needed to take. I noticed that math and statistics was a common theme among all Computer Science programs.
I hadn’t studied math since high school when I had taken a Calculus course. I was VERY rusty at math. I took 2 courses on Edx. One was a basic algebra course and the other was a basic geometry course. They were made for beginners and I finished them both within a week but they were necessary to restart my math education. Afterwards, I devoted all my time to studying Precalculus, followed by Linear Algebra and Calculus. I also completed The Analytics Edge on Edx. It was a lot of work. I used a number of textbooks and read every page, completed every exercise, and filled out at least 4 notebooks with notes, answers, and rough work.
It was incredibly rewarding diving back into Mathematics, one of my favourite subjects from high school. I studied every day for hours these 3 months. My only regret is that while I studied Math and Statistics, I neglected my programming. I didn’t code very much during these months. I did pick up a book called CODE: The Hidden Language of Computer Hardware and Software. It taught me how to understand how computers operate from a really low level. It was an amazing read and I learned so much that I wouldn’t learn in a high level programming course. I also begin Nand2Tetris but with everything else I was studying I never finished. I am planning to return to it when I have more time. After I finished my last Math course I knew it was time to turn my attention back to programming, and it was with extreme ease that I saw the relationship between Math and Programming as soon as I started to dive back in.
Concepts: Precalculus (Functions and Trigonometry), Linear Algebra, Calculus, Statistics, Binary, Computer Hardware
Concepts: DOM, AJAX, HTTP, IP/TCP, Searching and Sorting Algorithms, Computational Complexity and Big O notation, Complex Data Structures
Around my 9th or 10th month of studying I discovered a blockchain project named Request Network. Previously, I had lived in China for 3 years and was able to teach myself Mandarin to a fluent level. I wanted to get involved in the blockchain space and took it upon myself to translate the Request Network WhitePaper into Chinese. I contacted the team behind the project and offered the translation to them. They took it and had it looked at by a third party and it is now published at the link above. This was an great experience to get involved within the field before I felt able to contribute at a technological level. Upon seeing my work published on their website, I felt a sense of self-confidence that inspired me to keep learning and start developing my portfolio, think about which field I would like to work within, and start looking for employment.
Throughout this process I have been grateful to have been supported in this journey by my girlfriend, my family, my friends, and even some students that I discussed my plans with. I do not know yet where I will land but I know that whether I get a job or not I will continue to learn and enhance my skills. I am looking forward to begin to work with others at developing projects that can have significant impact on the world. My first year (and 3 months) of learning has come to an end and it is really just the beginning of a transition into the wonderful world of technology.