Wednesday, October 29, 2014

That "duh" moment you realize you're writing too many lines of code

This morning is day 5 of 21 rolling out of bed by 5 am. If you haven't been reading along, the idea came from a blog post I read a few weeks back, and looking at my schedule right now, it's the easiest time to guarantee time to study and work on my code.

It is interesting that it almost becomes easier to get out of bed everyday. Prior to deciding to try the 5 am challenge, I kept setting my alarm for 6 am and it became a morning routine to silence or hit the snooze and I'd tell myself "not today, you can go back to bed and I'll get up tomorrow" and I'd sleep until 7:30 or 8 in the morning and then get up and rush for work. Now it's becoming easier to pull myself out of bed promptly at 5 and then I grab a cup of coffee and sit down peacefully and distraction free to work.

This week I've been working on my game that I started way back in the summer which I kind of "forgot" about. It's gone through many iterations and started out as a simple JavaScript game that would run via a ton of window alerts. Then once I found out that wasn't a good idea, it started to evolve and it is now somewhat GUI based and includes HTML/CSS/JavaScript/jQuery. I think once I get a working version, my plan is to even transition the core JavaScript over to Ruby.

The challenge of being self-taught is that you don't always know when you might be doing things wrong. Your solution can work, but it doesn't always mean that the code is efficient or following best practices. It may work well for one user, but if you tried to scale it up to millions of users, things would start breaking or go incredibly slow. That's kind of where I feel like I'm at right now with some of the JavaScript/jQuery code. It seems to be working, but it's not as smooth as I'd like and I don't think it's very efficient yet either.

Even as I sit here typing, I just realized one major inefficiency and something I can do to improve my code! I was going to give a snapshot of part of the code as kind of a "before & after" look at how messy I feel the code is right now. Well there is a concept called DRY which stands for "Don't Repeat Yourself". That basically means if you have a chunk of code that you would have to type in multiple places, it's best to build one function or method that handles that code, and then call your function or method when you need it. The reason that is so effective is that if you later realize you need to add, modify, or delete some code, you can do it in one place rather than the 15 or 20  or 1000's of places you might use that code throughout your program:

In the highlighted text, you'll see two lines of code that I'm using a number of places in my code. As I went to take this screenshot, that "duh / ah hah" moment finally hit me.


Rather than writing each of these lines of code 5-7 places throughout my code base (basically once per each scenario or transition in my game), I'm going to create a Function to handle this for me.

New Function called "change_div" to reduce the amount of code re-use:


Now if I need to make a simple change or add a line, I can do it in this one spot.


Calling my new change_div function with the highlighted piece of code:



I nearly didn't write a blog post this morning because I wasn't exactly sure what to write about. However, I want to keep up with it and part of #my5amChallenge is to write about the things you learned or accomplished. Well I'm glad I sat down to write this blog as I just learned something very valuable about half way through!

That's kind of how it works with coding sometimes....you get stuck somewhere and try and try to figure something out, and then it all of a sudden comes to you at the most random moment. I wasn't really stuck there, but that change is much better for an "Object-oriented" programming style which is what I'm trying to learn.

Time to dive back in the code and work on building some more of the functionality out!

Saturday, October 25, 2014

Equality and Ruby Variables - a few of my learning's from this week

I've been trying to get up at 5 am everyday this week to work on my coding, and I actually did a pretty good job except for Friday morning. I'm a huge Broncos fan and we had the Thursday night game so I didn't make it to bed until nearly midnight. After getting up at 5 am for a few days, I was just too tired and needed the extra sleep.

I did make it up at 6 am today though (even though I'm not doing the 5 am challenge on weekends) and have been working on my problems. I wrapped up my first problem which was implementing a simple Array class in Java and Ruby that has "create, delete, search, and display" methods for working with the array. I thought I would take a few minutes to at least share the things I learned and a few of the "gotcha" moments.

When trying to implement the solution in Ruby, my first stumbling block was working with & declaring the right type of variables. In Ruby, you have global variables, class variables, instance variables, & local variables. I'm going to try to briefly explain them, but to help give context I'll give a simple example of classes & objects.

If I were writing a program to control working with vehicles, I would potentially have a "Vehicles" class, and two sub-classes called "Cars" & "Trucks". Classes help control behavior and allow you to create "Objects" which all share similar behavior. I would create certain behavior in the "Vehicles" class that would apply to both Cars and Trucks, and the "Cars" and "Trucks" classes would both inherit that behavior. The reason I would do this is that both Cars & Trucks have Tires and doors, and windshields for example, and rather than specify these features in both classes, I can type it once in Vehicles and let both classes inherit those features.

Now once I have my classes, I can then create specific objects. So I have a "Cars" class that outlines the features and behaviors, but then I create a "Car" object that is the actual car itself with its own unique make, model, color, etc.

Hopefully I made that simple enough and not too confusing, but not on to explaining the variables and where I got stuck.

Global variables - are just what the name suggests, they are globally available throughout your program. So if I have a Vehicles Class and Animal Class, I might declare a variable in one of them, but I could still access that variable from the other class as well

Class Variables - class variables apply to that class & the objects within that class. So if I have a Vehicles Class and a Animal Class, and I declare a variable within the Vehicles class.. any of the objects within Vehicle can use that variable, but the Animal Class & all of its objects cannot see or access that variable.

Instance Variables - Instance variables are accessible across methods for each instance of an object. So going back to the Animal Class, I might have a "make_noise" method and maybe I need to create a variable "noise" to store information. I could have a "Dog" object that stores "bark" in the noise variable and a "Cat" object that stores "meow" in the noise variable. So basically I can use the same variable name, but its a unique variable each separate instance of the object and can only be accessed by that object

Local Variables -  local variables are only accessible within a single method. So if I had a "Dog" object, he could have different methods such as sleep, eat, walk, etc. If I declare a local variable within the sleep method, eat and walk cannot see that method. To help tie in the explanation, if I instead declared an Instance variable above, the variable could be seen and accessed in each of the eat, walk, and sleep methods.


Didn't meant to turn this into a long definition post, but sometimes I get carried away :)  The main point of all of that is that when creating my Array program, I wanted to create an Array class that could create Array objects. I was trying to write my code similar to how it was in the Java code, but for Ruby I needed to create the scope for my variables. I needed an Instance variable that would apply across that object so that in each method I created, it had access to my Array object.


The second "gotcha" or stumbling block for me was equality. In programming, = vs == mean two completely different things. With a single = sign, you are setting something equal to something. For example, a = 5 will set the variable "a" to equal 5. Whereas with two equals sings "==" you are comparing two things. So with "a == 5" you could compare does "a equal 5". If it already does, one thing can happen, but if it doesn't something else might happen. I had a few different areas where I used a single equals sign instead of a double equals sign, and it created odd behavior in my program.

One thing I've found is that when learning to code, you are trying to absorb so much new information that it can be easy to slip up and miss one minor thing, such as a single = sign versus a double == sign. I suppose the bright spot is that I can at least identify and fix my error now rather than having to post to Stackoverflow for someone else to explain it to me!

Well back to coding for a few more hours before I get my weekend started!






Thursday, October 23, 2014

Feeling tired

Day 2 of my 5 am challenge and third day in a row waking up before 6 am. I'm EXHAUSTED this morning, but forced myself out of bed and am slowly feeling more alert. I have to start getting to bed on time so I get a full 7 hours at a minimum.

Anyway, I finished up the CodeAcademy Ruby tutorial yesterday and have the first parts of my current Data Structures problem complete. Here is a quick snapshot of my current code state:



I also forgot to mention that if you're a developer or learning to be and use Github, my handle is austi003. I'm trying to work on keeping all of my work updated and I even have one collaborator (my mentor) on the Data Structures repo so that I can get used to pull requests and branches and all that good stuff. 

Alright, enough writing this morning, time to start learning! 

Wednesday, October 22, 2014

5am Challenge - Day 1 (officially...)

Even staying up a little later than I typically do, I still managed to force myself out of bed around 5:05 this morning. It's actually not so bad once you actually stand up for a minute or two and force yourself out of the comfort and warmth of bed. I let the dogs out as usual, grabbed a quick cup of coffee, and now time for a quick update before I dive back into my studies.

One thing to mention for those that have been following along... I've heard some great advice from other bloggers (about code) that I thought would be useful and I'm going to follow a similar format. That is, I'm really writing these for me as a refresher, and if I'm able to provide value for other readers great! The basic idea is that I can blog about things I learn, and it keeps a running record of documentation (or notes) on topics and problems I encounter. That way if I run into something similar down the road I can think to myself..."aha..I wrote a blog post about that way back when..." and search back and find my notes.

I'm getting to the point with code where I can start to read and understand, but it takes me longer to actually write or come up with my own code. It's very similar to learning a foreign language, like Spanish for example. I took a few years of Spanish in high school, and while to this day I can read certain things and understand the gist, it is much harder to listen and understand a native Spanish speaker, and even harder for me to form more than a very basic sentence that even a 4 or 5 year old would say.

I'm currently working on Ruby because I'm trying to get the syntax down enough so that I can implement my Data Structures in Ruby as well as Java. Java is a lot more rigid and you have to directly state certain things, whereas in Ruby you can write less code and accomplish the same thing. Ruby reads a lot like pseudo code (very similar to plain English just explaining on how a block of code would work without worrying about exact syntax).

For example, here is one simple line of Ruby that anybody can probably guess what it does:

    def greeting(name)
          puts "Hello #{name}!"
    end

   greeting("World")


As you might have guessed, the output of this simple Ruby script would read "Hello World!"

I spent about 2 hours yesterday morning and another 30-45 minutes yesterday evening both working through the CodeAcademy (www.codeacademy.com) Ruby Tutorial as well as updated my first problem I'm trying to implement in Ruby. I at least got the first part working which is really just an Array class to construct my arrays from. I got to the Object Oriented section of the Ruby tutorial which really helped because it also reminded me of Instance variables and what scope I need to provide which variables. I'm pretty sure the reason my initial solution was not working was for this very reason. I was trying to call a variable from a different method that did not have access to that variable. Here is the little bit of code so far, but I should get a lot more of it done today:



Yes it doesn't look like much for over 2 hours, but it was more studying through CodeAcademy and then refactoring my code to make this first part work, so I'm proud of it! That's it for today...time for some studying!





Tuesday, October 21, 2014

The 5 AM Challenge

5:40 AM - Tired! It's been quite a while since I've posted anything, and too be honest I haven't been very disciplined about sticking to my lesson plan either. About a week or two back, I read an interesting article about somebody that woke up every morning at 5:00 am for 21 straight business days (he did exclude weekends). The idea behind it was it takes 21 days to form a habit, but he also found that he is more productive early in the mornings. He was able to get up distraction free and do several hours worth of work before the rest of the world even wakes up. Emails, workouts, sunrises, etc.

It got me thinking and I've decided to try it myself as early morning is the best time to study and work on my coding completely distraction free. I didn't make it out of bed until 5:30 today, but it's at least a start.

So for 21 business days, I'm going to get out of bed at 5 am and from 5 - 8 am I plan to do something productive. Most days it will be studying and working on my coding problems, but I may try to mix in the early morning workout too. My plan is to write a blog post each day about something I learned or accomplished, but given my track record we'll see how well that goes :)

So here it goes...time for some Data Structures work!