Why I Decided to Learn Software Development

It was a long time ago actually that I took a nascent interest in coding at all.  In the spring of 1996, I completed my high school freshmen enrollment schedule before graduating middle school.  The fall came, and I found myself in a computer programming class learning BASIC.  At the time I felt intimidated by not only the programming language, but especially the other students who seemed to have prior experience and were keeping up with the teacher. It didn't click for me at that time. I visited my guidance counselor and got out of it. It would be years before I'd ever seriously look at code again. Instead, I took a serious interest in music for the remainder of my high school years, all the way through college and meanwhile harboring a deep love of tech. 

In 2005, I graduated from the University of Florida as a music educator. Five years later the county cut my music position after I enlisted in the U. S. Army Reserve in 2010. So from 2011 onward  I spent years on and off active duty, bouncing between the Middle East and the United States from 2012 until the present.  Throughout all of these years I really wanted to code. In fact, it grew to the point that I knew I didn't want to teach anymore. I still felt that it was beyond my ability until I met my good friend, Staff Sergeant Myers, who encouraged me to take the plunge because he had seen my raw potential in tech whether as an information technology professional or software developer.

In short, while I deployed to Kuwait in 2016, that year proved to be what I consider the most crucial year for tech and my country (US), whether one was a systems administrator, cybersecurity professional, and/or a coder. In my eyes, 2016 was a pivotal year where the virtual world and the real world coalesced, or maybe even collided, in perhaps a perfectly unintended way. I was both riveted and dismayed by the entirety of 2016, and the role tech had within it.  Something ignited within me that year, such that I formed a plan to get educated and experienced in tech some way, somehow.   

My values were ignited that year and were challenged! And my passion for tech suddenly had deepened with meaning and purpose. All I needed was the means to act on my vision to create, that is, to code and collaborate on health-conscious technologies. Why? 2016 was a call to action. That year showed me that the unintended consequences of things we develop without any ethical foresight and preemption could have real-world implications--particularly in the areas of privacy, security, and epistemology or truth. That year also proved that software developers (or engineers) have a philosophical imperative to create with a conscience. Apple made a subtle but powerful video advertisement titled, "Designed by Apple in California."  One portion of the video asks the following: "Will it make life better? Does it deserve to exist?" One can hate Apple's high-walled ecosystem of products, but we certainly cannot doubt their intention and caring thoughtfulness about user experience.

Finally, the current business model for the most popular web platforms enlivened me to the importance of the way web technologies are designed. For instance, I would encourage moving away from user interfaces and experiences that are inherently meant to commoditize the user. What do I mean? Perhaps define and create better social media platforms that do not psychologically and physiologically exploit the user's baser instincts (e.g., dopamine-fueled scrolling on bottomless feeds and a token economy of "Likes.")  To wit, I think existing web and mobile technologies are amazing!  But I believe that we can do better, and I would like to be part of shaping a future that cares about the mental and social well-being of the user.  I believe learning software development enables me to have a seat at the table and even perhaps help to remake the table for a better social web and real-world experience.

OO Tic Tac Toe In Ruby Complete!

Shortly after writing my previous blog post I jumped headlong into my final Intro to Ruby Lab (OO Tic Tac Toe) and completed it.  I think it didn't take me long to refactor the code because I have prior experience with creating objects with classes in Java. (Cringe? LOL)  In case, you haven't already read my about page, I completed an Introductory and intermediate course in Java at the University of Maryland University College online between the timeframe of Fall 2016 and Spring 2017. So it was basically a matter of a transliterated understanding of how Java classes work uniquely compared to how Ruby classes work.  For example, Java uses the 'this' keyword, whereas Ruby uses the '@' symbol for an instance variable.  

So, below is the TicTacToe class on the left and the procedural code on the right.

Screen Shot 2018-04-14 at 11.22.20 AM.png
Screen Shot 2018-04-14 at 11.22.30 AM.png

Procedural vs Object Oriented Ruby

This is a lab the requires that I refactor all of my procedural code for a Tic Tac Toe game to object-oriented programming. This entails removing certain arguments from many of the methods I created due to the lossy and buggy potential of continuously passing around the same value. Also, the procedural code makes scalability a nightmare; to expand functionality and behavior. You'd essentially have to re-write old code and then write entirely new code to expand the application. Conversely, using an instance variable wrapped within a class method is a better and less buggy practice.  This is what I understand so far from my reading and labs in Learn.co

I just started this lab.  I'll show you my results later.

Screen Shot 2018-04-14 at 9.43.49 AM.png

Walk Away And Return

Short and sweet.

I was working on the Tic Tac Toe Game Status lesson in Learn.co and got stuck on a particular method--the #winner method.  I got frustrated because I was just not able to abstract what was needed to solve the test problem.  So I got up and watched television.  

"David! Isn't that irresponsible and a time waster?"

Ordinarily, you'd be right.  But no, it was not a waste of time.  And it was a mature and responsible response to the moment of frustration.  I got up and walked away to do something completely different.  And on top of that the very show I watched hit on the very thing I was struggling with from quite an esoteric angle. (The show was HBO's "Here and Now," by the way.) 

When I was done, I plopped back down in front of my computer and in under two minutes, I solved what I had initially toiled over for about an hour prior to walking away from it.

Life is not all logical and clean and neat. It's ugly and beautiful and random and scary and amazing, and so much more.  Sometimes you have to let go in order to learn real control and discipline.

Take it or leave it. :)

Lastly, I did ask for help with other things earlier on in the lesson.  You gotta let go and ask for help. This is a form of strength and maturity!

Fizz Buzz Test

While reading my lesson called Rspec Fizzbuzz, I learned about the Fizz Buzz Test.  It's intriguing!  Check it out here:  Fizz Buzz Test.

Description from the site:

"The 'Fizz-Buzz test' is an interview question designed to help filter out the 99.5% of programming job candidates who can't seem to program their way out of a wet paper bag.  The text of the programming assignment is as follows:

Write a program that prints the numbers from 1 to 100.  But for multiples of three print "Fizz" instead of the number and for the multiples of five print "Buzz".  For numbers which are multiples of both three and five print 'FizzBuzz'."

The site's author is pretty snarky, but his sentiment is well-heeded.  A computer programmer should be able to problem-solve beyond wrote skill knowledge and proofs.  Here is a blog post talking about it and an excerpt below:

"FizzBuzz was presented as the lowest level of comprehension required to illustrate adequacy. There's no glory to be had in writing code that establishes a minimum level of competency. Even if you can write it in five different languages or in under 50 bytes of code.

The whole point of the original article was to think about why we have to ask people to write FizzBuzz. The mechanical part of writing and solving FizzBuzz, however cleverly, is irrelevant. Any programmer who cares enough to read programming blogs is already far beyond such a simple problem. FizzBuzz isn't meant for us. It's the ones we can't reach – the programmers who don't read anything – that we're forced to give the FizzBuzz test to."

With all this said, it is my plan to complete at least one coding challenge per week.

Full Stack Web Developer, Begin!

I enrolled in Flatiron School on Monday of this week, and the learning has been smooth sailing thus far. To I completed my 30-minute video conference with my non-technical coach, which is a free resource that FS offers to its students.  The non-technical coach is a means of keeping the students accountable if they want it, and to stay on track with their end-state learning goals.

As far as the learning is concerned, a good portion of it is prior knowledge for me due my both my self-taught background and education through University of Maryland University College.

I'm off to a great start!

Screen Shot 2018-04-06 at 10.54.21 AM (3).png

Flatiron School's Bootcamp Prep and the Case of the Missing IDE

The bootcamp prep course through Flatiron School is phenomenal...so long as it allows you to continue.  My excitement and enthusiasm to work on the coursework have been atmospheric. Today I was on a role until I got a special little notice at the bottom of the browser stating that I've made enough progress to just go ahead and apply.  So now the IDE doesn't launch, preventing me from coding.

Progressing won't be happening although I actually wanted to blast through the prep before I begin in April to work through the actual web development course online.

At any rate, I have applied to FS and therefore will not be enrolling with Bloc simply because I like the platform, the support, and progress that I have already made with FS.  What's also awesome is how FS incorporated an online IDE and terminal into the learning platform called Learn.co.  I can also jump right into Slack from my Learn.co account as well as push and commit all of my labs to GitHub, which is also incorporated into Learn.co via an API.

I'm not even an official student yet, and love how FS works!

Stay tuned!

centuryFromYear [Code]

I'm hungry for coding!  So I joined a site called CodeFights.  It's a really neat place to put one's coding skills to the test and to just get dirty.  It is a perfect place in which to experiment, research, and learn new things.  As a beginner, I am gaining problem-solving skills as well as familiarizing myself with JavaScript.  The CodeFights (here forward referred to as CF) allows the user to choose a language of choice with which to complete the coding challenges or the coding interviews.  Yes!  CF has an option to practice for coding interviews! 

Anyway, here is my code for the Arcade challenge called centuryFromYear. Let me know how I could have coded better. 

Questions:

  1. Is there a simpler way to code the function?
  2. Do you see a possible test case that would fail?
  3. Is my code readable or unnecessarily complex?
  4. How did I do with following coding conventions (variable names, indentation, brackets, parentheses, etc)?

centuryFromYear

Description:  Given a year, return the century it is in.  The first century spans from the year 1 up to and including the year 100, the second - from the year 101 up to and including the year 200, etc. (In other words, I am to create a function that will achieve this.)

Language:  JavaScript

My code (51 lines; not including the test code far below):

(The following was accepted by CF as a working solution. It passed all 9 test cases far below.)

function centuryFromYear(year) {
var yearToString = year.toString();
var century = 0;
var strCentury = 0;

//Checks for four-digit year.
if (yearToString.length === 4) {
    //Checks for final year of the century to prevent adding
    //a century.
    if (yearToString.substring(1) === "000") {
        century = yearToString.substring(0,2);
        century = parseInt(century);
    }
    else if (yearToString.substring(2) === "00") {
        century = yearToString.substring(0,2);
        century = parseInt(century);
    }
    //Otherwise adds century and parses the string to initialize
    // the variable century with the proper number of centuries.
    else {
        century = Number(yearToString) + 100;
        strCentury = century.toString();
        strCentury = strCentury.substring(0,2);
        century = parseInt(strCentury);
    }
}

//Checks for a three-digit year.
else if (yearToString.length === 3) {
    //Checks for final year of the century to prevent adding
    //a century.
    if (yearToString.substring(1) === "00") {
        century = yearToString.substring(0,1);
        century = parseInt(century);
    }
    //Otherwise adds century and parses the string to initialize
    // the variable century with the proper number of centuries.
    else {
        century = Number(yearToString) + 100;
        strCentury = century.toString();
        strCentury = strCentury.substring(0,1);
        century = parseInt(strCentury);
    }
}

//Checks for two-digit year.
else if (yearToString.length === 2 || 1) {
    century = 1;
}
return century;

}

Tests (custom test code I wrote):

//Runs through nine test cases to ensure the function returns the proper //century for any given year. var testArray = [1905, 1700, 1988, 2000, 2001, 200, 374, 45, 8];

//Iterative loop for testArray. for (var i = 0; i < testArray.length; i++) { document.write("Test Case " + (i + 1) + ": " + centuryFromYear(testArray[i]) + " century" + "<br>");
}

Output:

Test Case 1: 20 century
Test Case 2: 17 century
Test Case 3: 20 century
Test Case 4: 20 century
Test Case 5: 21 century
Test Case 6: 2 century
Test Case 7: 4 century
Test Case 8: 1 century
Test Case 9: 1 century

JavaScript: Strings and Numbers

Since having started my search for a coding school, I have taken full advantage of Flatiron School's free online Bootcamp Prep course.  It appears to provide a lot of the fundamental requisites for success in the developer track

HMLT & CSS

To review, I have gone over HTML and CSS, with which I have a good deal of experience already.  I did, however, gain some additional knowledge that was unknown to me.  Rather, I have worked with these things through raw experimentation, without knowing them by name./

  • Compound Selector
    • h1, h2, #box {...}
  • Descendant Selector
    • #nav li {...}
  • Child
    • #list > li {...}
  • Adjacent Sibling
    • h3 + p {...}
  • General Sibling
    • h2 ~ p {...}
  • Universal
    • * {...}
  • Attribute Selectors
    • img[alt="Cat"] {...}
  • Pseudo Selectors
    • a:link {...}

JavaScript (JS) and the Document Object Model (DOM)

As for JS and the DOM, I have prior experience with this from introductory resources that I've utilized across the web. The bootcamp prep course has been a focus on utilizing the inspector tool with the Google Chrome Developer Tools and how to select certain elements within a page by using JS. For example, in order to find a CSS ID, such as "#height", I would type the following into the inspector Console:

document.querySelector("#height")

This might return something like this:

<p id="height">74</p>

And if I want to get the sole value from the elements returned with the previous code, I can add innerHTML to it.

document.querySelector("#height").innerHTML

This might return something like this:

"74" Now, let's say that I want to add two additional inches to the height. Note that the innerHTML value immediately above is a string and will need to be converted to a numerical value. This can be achieved by using the parseInt() function. Otherwise, if we simply attempt to add 2 to document.querySelector("#height").innerHTML , it will simply return a concatenation of "74" with the 2 , returning a new string value of "742" instead of the number 76 .

Here is an example using parseInt() :

parseInt(document.querySelector("#height").innerHTML)

This will return the following:

"76"

Instead of typing all of the code in the previous example, it can be stored in a variable for easier use and less code in the future.

var heightSelector = document.querySelector("#height").innerHTML

Then we can utilize the parseInt() function again and add two inches to it.

parseInt(heightSelector) + 2 will return the same value as the previous example: "76" .

Journey of Code

At last, I am here at the head of a path into the coding boot camp.  After years of wavering back and forth on whether or not to even do a coding boot camp I have finally chosen the Flatiron School.  I have not yet applied and honestly cannot afford it outright.  I have to apply for a loan and know that I could possibly be turned down. I am hoping to God that I can get it without needing to ask friends or family for financial support.  This is an opportunity for a new job and career transition within the next year.

At present, I am enrolled in the Software Development bachelor of science program through the University of Maryland University College online.  It is an okay program that I fully intend to complete.  But in terms of obtaining the most immediate means to employment and fulfilling my passion for coding, I am choosing to parlay my degree program to do a boot camp.  It is my conviction that this is the best way forward.