Programming: A One Year Journey of Self-Learning

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.

Month 1:

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.

Resources Used: Hacking with Swift, Code with Chris, Mimo

Languages: Swift

Concepts: Data Types, Conditionals, Loops

Months 2-3: 

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 Sciencewhich 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

Months 4-6: 

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.

Languages: Swift

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

Resources:

Months 7-10:

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

Resources:

Months 11-12:

I returned to programming with zeal. I knew I was rusty after taking 3 months off so I started with Harvard’s CS50. Professor David Malan re-introduced programming to me with excitement and genuine passion for the field. I watched most of the lectures at 2x speed with subtitles on but found some of the psets (homework) challenging yet fun. The course started with C (Scratch actually, but I skipped that) and went into many of the lower level aspects of programming that I had learned 10 months before with CS106a. The course moved on to Python and web programming using Flask, SQL, Javascript, HTML, and CSS. I finished the course in about a month and felt right back at home with programming. The courses was very well put together and I believe would serve as a great starting place for a beginner programmer, though you wouldn’t be able to finish quite as quickly if that were the case.

Following CS50, I began to work towards building my portfolio. I completed some challenges on FreeCodeCamp and continue to work at this, I learned linux command line by playing two games: OverTheWire and Command Line Murders.  I watched some lectures from CS50’s follow up course Web Programming with Python and JavaScript. This course went over concepts I was familiar with and was quick and easy to soak up and further my learning. I ended the year by making my first year of programming with a number of questions in mind: Which direction would I like to continue in: App development, Web development, AI, Blockchain technology, etc…? Am I qualified to begin a career in this wonderful field? Should I get a CS degree first? What’s next?

Languages and Frameworks: HTML, CSS, C, Python, Javascript, Flask, Bash,

Concepts: DOM, AJAX, HTTP, IP/TCP, Searching and Sorting Algorithms, Computational Complexity and Big O notation, Complex Data Structures

Moving Foreword:

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.

I finished my first year of programming about 3 months before writing this post. Throughout this time I became very interested in Blockchain technology and have spent most of my time since then learning about developing within this field. I began by getting a better understanding of Web Programming, especially Javascript. I read a book named “Eloquent Javascript“, which contained many exercises and projects which I completed. In order to fully understand where Blockchain Technology was coming from and what it was, I read “Mastering Bitcoin“, the Bitcoin Whitepaper, as well as the Ethereum Whitepaper. I began learning Solidity, first by reading the docs, followed by learning to create a game called CryptozombiesFinally, I took two online courses offered at IBM that introduced Blockchain technology for businesses, using Hyperledger Fabric: A linux foundation Blockchain framework. More info about those courses can be found here. I created my first blockchain and smart contract using these resources.

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.

Advertisements

Becoming Mountains

It was just before winter hit in 2016 that the idea Becoming Mountains first appeared. Sid, a great friend from high school, and I were out eating Korean food in North York, Toronto. We were talking about my recent visit to Vancouver. Between love stories, and hiking trip tales, we started to talk about satisfaction, enjoying life, and not being stressed out or anxious. We talked about living healthy, being in our prime, reaching for our goals, and happiness.

These topics were not new to me. They had been on my mind for years. A year and a half prior to this conversation, we’d spent an entire day at the boathouse talking about similar topics. Books were recommended, quotes spoken, and a lack satisfaction was expressed by everyone present. These feelings were shared since high school, though a resolution to these discussions was never reached. It usually resulted in ordering another round of drinks and forgetting about it until the morning.

That night, after I returned from Vancouver I jokingly mentioned to Sid that I was going to become a mountain. Mountains exist and are satisfied just the way they are. They are formed and remain for thousands of years. They weather any storm. They don’t let just anyone climb them and never let anyone stay for long. They are grand and lofty. They erode and eventually disappear, just like us.
Hiking and meditation had taught me a lot and I learned a lot from mountains. I learned to be satisfied being myself, and with the things I said. I learned to appreciate things, everything (another gift given by Sid – thats another story). I learned to be confident. To be comfortable. To be a kid again. I was learning to become a mountain.

When I first mentioned this title to others they were taken aback at first and I can understand why. To them mountains can take a beating but keep on standing, as if they are rejecting what is happening around them. Denying their emotions. Closing themselves off to the world. I took time to think about this. I even debated changing the name to becoming water or rivers. Becoming more fluid and being the stream that flows down from the mountain tops.

After careful debate, and many talks about the name I decided to stick with becoming mountains but address this problem in my writing. Mountains do not close themselves off from outer circumstances; they erode, avalanches occur, and eventually even the tallest mountain will become a small stone. These are all natural phenomenon but the mountain doesn’t stop being a mountain. It takes the beating, it might suffer in some form (a dead forest on its hills, a giant boulder falling off one of its many cliffs) but the mountain remains for the time being. There is no rejection of what is happening to it. It wears its scars proudly.

Becoming Mountains the book will be coming out later this year and discusses this in much more detail. It goes into many topics on how to become a mountain, on how to be comfortable with who you are, confident in striving for what you want, cultivating healthy and fulfilling relationships, and being the best person you can be. The book also discusses how to weather the storms of life like a mountain. Not by shying away and cutting yourself off from the world but by being confident and comfortable with your emotions and your reactions toward them and others.

The book uses a metaphor of a house to exemplify all of the topics. The book walks you through the building of a house that will protect you from storms, set up healthy boundaries, bring positivity into your world, and even teaches you how to be a responsible host to the unwanted emotions that come knocking on your door.

This book is more than a self-help book. It is a personal manifesto that taught me how to live a more satisfying life. Throughout the writing of this book I learned what really interested me. It forced me to evaluate my life in ways I never had the opportunity to do before hand. It led me to the decision to switch careers. It gave me the confidence to tell my loved ones that I was dissatisfied in my current career. It helped me forgive those who were taking up way too much of my brain power. It allowed me to love more deeply than I ever had before. To put it simply it made me better and I want to share it in the hopes that it might make others better too.

Programming?

If you check out this blog you will notice that there will be a mix of content. Some posts will go into programming and coding while others will discuss becoming mountains and the ideas that go along with that. I will try to keep them separated but they both take up a big portion of my life and they will often be intertwined.

It was the writing of this book that led me to programming. The day I hit 10, 000 words I spent the evening watching the NHL All star game with my 6 year old nephew Liam, and Sid. Afterwards, Sid and I went to his house to watch a movie. We never ended up watching a movie but instead spent the whole night talking about programming and business. I felt enthralled by the world and stayed up late that night researching this new journey I was about to embark on and I haven’t looked back.
These two topics, though seemingly different, are very interconnected in my life and I want to share them both with the world. I find more fulfillment in programming than I did in my previous career and will discuss more of why that is in the future.

Everyone is struggling. We are all on Earth together. We can help each other become mountains and that is what I aim to do with this book and this blog. Please join me on this journey to become a mountain.

“Mountains may have a path that lead to it and up it. But that mountain would exist whether the path was there or not. It is not the result of the path”

Before this time I always felt like I was constantly underachieving. Drinking too much. Not eating healthy or working out enough. Seeking something that I couldn’t find or even name. When I look at my life I can see that it is full of accomplishments but yet I never felt satisfied with these achievements. Most people would probably say I am not underachieving but we are our worst critics.

A little bit about me

I come from a relatively well off and educated family. My father is a professor and my mother a teacher. My uncles are almost all professors, teachers, or principals. It was pretty much expected that I would be going to university, which I did in 2006. I went and got a liberal arts degree in history with a whole bunch of english literature supplementary courses. I wasn’t left with many options when I graduated so I went into the family business: education.

I got a bachelor of education and immediately took off abroad to teach. I worked in China for the next three years. While I was away I learned a lot.

Lessons Learned From My First Month of Programming

I started programming a few months ago. Me and a friend were up late talking about our futures and we both concluded we weren’t happy in our jobs. Me as a teacher, him as an IT professional. After a lengthy conversation, we’d determined that he would be better suited in the world of business and since he was in tech and told me about all the possibilities, I became fascinated with the world of programming. I stayed up late that night researching as much as I could about it.

I had no programming experience before that night. I remember looking up the word ‘String’ trying to figure out what that even meant. I hadn’t heard of java more than the pop-ups that appeared sporadically asking for updates. Swift, not a clue. Python, a snake? The world of C, C++, and the rest of the programming world was Greek to me. I was 28 and had no idea what anything meant that first night I spent googling for information. I had been to codecademy.com and had started ‘html’ in the past but had stopped after the second lesson.

So that’s where I started my journey. I was at the bottom of the mountain. I had so many questions but didn’t have any programming friends, no network base, nothing. Just google.

So where did I start?

I started with swift. Not sure why? Maybe because I had an iPhone and a MacBook and it seemed like the logical choice. I’d googled programming for iPhone or iOS and swift came up and so I started there. I didn’t even learn about Objective-C’s existence for another month and even then had no idea what its purpose was.

When I woke up the next morning I got right to work. I was motivated, ready to learn the language and make apps. I thought that’s how it would work. I just needed to learn the language and then put it into some program and away we go. I had not researched enough. If you’re reading this right now, go and google “things I wish I knew when I started programming or coding.” I wish I had done that.

Or keep reading because I’ll tell you all the things I wish I knew when I first started.

The language
So I started with the language. I can speak a number of human languages and decided to treat this the same way. I literally went on the AppStore, searched ‘Swift’ and downloaded the first app that looked promising. I think it was called ‘”Swifty” and then changed its name to “Mimo” while I was halfway through using it. It had a similar flow to human language learning apps and I like that.

Mimo goes through a bunch of different concepts that are essential for programming, variable, constants, functions, classes, arrays, etc… however it just teaches how to use these concepts in the swift language. It did very little to explain what an array was or how I could implement it in a program. They assumed you knew how to program and were just learning a new language.

I would compare it to going to Japan, being give a list of Japanese words, with their romanticized pronunciation and being told to go get a hotel room, dinner, and get a job with that. The actual definition of the words and their English translation not given, you would certainly wind up in trouble. I had the language but no concept of what to do with it.

Mimo was a great tool to learn the swift language and it doesn’t advertise itself as anything else, but it doesn’t offer any fundamentals of programming. You have all the ingredients but no recipe. I almost finished before I realized I had no idea what to do with what I was being given. I stopped. It wasn’t a wasted 1-2 weeks though. I learned a valuable lesson. I wasn’t going to be able to just jump right into this world. I tried the sink or swim approach and realized that there was no swim method, just sink.

Obstacles and Next steps
So I regrouped. I figured that I knew some very basic swift (very basic – I could say hello (world) to some local Japanese people and say goodbye) but I had a long way to go. It would be more challenging than I initially thought but I kept going.

I decided it was time to just make something. 2 weeks had gone by and I had nothing to show so I wanted to see how to actually program something. I downloaded Xcode. I would be able to use swift to build an actual application or a program with Xcode.

I spent the next 2-3 weeks playing around with Xcode and a ton of online tutorials. Two tutorials I used that were really well done were: hackingwithswift and codewithchris. Watching their videos and reading their posts and books helped a lot. It was like meeting a foreigner in Japan, who spoke the language and understood the culture and wanted to help you do the same. So I followed them around, getting acquainted with some of the features of Xcode, and swift. They had their own techniques and included different concepts that the others left out.

I made programs. They weren’t mine because I pretty much followed the tutorials word for word but I was able to see things(objects) actually appear on a screen. Even though it wasn’t my code I got excited. I showed my family and friends. I felt like I made progress with the help of my new friends.

Hacking with swift introduced me to API and frameworks. I now knew of its existence after a month but had no idea how to really use it. With the help of these tutorials I started to get a sense of how to use them and where I could go if I was stuck. The tutorials were well written, and easy to understand and follow.

Code with Chris introduced me to programming fundamentals. I learned how to apply the language in a way just learning the language could never offer me. I learned what about Object Oriented Programming, and Model-View-Controller (MVC). I learned how to really use Xcode with the help of these videos and encourage anyone who would like a tutorial of Xcode and swift to check out Code with Chris.
After a couple of weeks of this approach I realized that I wasn’t improving the way I wanted to because I would just find myself copying the tutorials. I wanted to write my own code. The tutorials made some sense of the language I had picked up with Mimo, however I felt that there was a large gap of programming fundamentals that I was lacking. It was as if these friends of mine could hold my hand, introduce me to locals, but the minute they walked away I could just muster a few words and then have nothing else to say. So I told my friends that I appreciated their help and would certainly be back if I needed a helping hand but this was a journey I had to do on my own. I had to start from scratch and climb this mountain on my own.

A month had passed since I had decided to take on this journey. I had learned so much. I had learned what I had done wrong, what had helped and what hadn’t. I don’t regret anything: I wish I hadn’t jumped right into the language without knowing the principles. I wish I hadn’t just copied the codes word for word from others without knowing why I would be doing it that way. But I don’t regret having done it. I learned what a programming language looks like. I learned that that language can actually put objects on a screen and be used. I learned about something called an API reference that scared me when I looked at it.

But most importantly, I now knew what I had to do: I had to start from the beginning. I had to learn the foundational principles of programming, then I could put the language and the principles together to build programs and apps.