omscs, gatech Photo Credit Background A few years ago, I was having a casual conversation with a friend who mentioned that he was interested in a new program being offered by Georgia Institute of Technology, which was being advertised as the first ever accredited program using a Massively Open Online Course (MOOC) format.  I was immediately interested because with my schedule and full-time job, online courses have suited me and is what has allowed me to get my Bachelors in Computer Science, as well as my previous Associates.  At this time, I still had well over a year remaining in my undergrad program so I did preliminary research, and filed the information for later consideration.  My research sparked quite a bit of excitement because the specializations for the program included Machine Learning and Interactive Intelligence, two topics that have intrigued me for quite some time now. Last semester, prior to my undergrad graduation, I decided to really inspect Georgia Tech's program in order to see the prerequisites and note any deadlines and information that I needed in order to proceed. The requirements seemed to be a pretty standard affair, sans the usual requirement of GRE test scores.  I made a plan and a schedule to complete each action item in order to apply for the program for Spring 2017. The Process Georgia Tech required some simple data from me being an out-of-state, but non international student:
  1. A Statement Of Purpose (2,000 characters)
  2. An objective
  3. Transcript (Unofficial accepted initially)
  4. 3 Professional References (I did a current tech lead, a former HR manager, and a former co-worker/manager)
  5. Personal Demographic Data (standard identifying data)
  6. Uploaded (or mailed in) Identification such as driver's license
As expected, although this program does use the MOOC format, applicants still need to have a bachelor's degree, as well as some experience in Computer Science, Math, Technology to be accepted.  Going by their last statistical update, they've had 10,697 applicants, with 3350 actual admissions into the program, so although it is using a MOOC platform, the decision process still upholds the expectations that one would expect of a top 15 Computer Science University. Applying was relatively easy, the most taxing parts were writing the statement of purpose and nagging my references.  Honestly, I find it difficult to write about myself in a persuasive manner and found writing the SOP relatively difficult.  In fact, it took me a month or so writing bits and pieces of the statement before I was able to come up with something I felt was honest and true to myself, while describing my interest in the program succinctly as well as demonstrating my absolute excitement for getting accepted. One thing to note, I originally applied to the Fall semester but one of my references did not complete the process, so my application wasn't "officially submitted", so when I officially submitting everything, my next available date was for the Spring semester.  This worked out better for me in the long run, considering the transitioning that I have gone through over the past few months with getting a new job as a Senior Full Stack Developer and moving to a new place. Once everything was submitted, all that was left to do was to wait.  Boy did I wait... I went almost crazy waiting.  I read https://www.reddit.com/r/OMSCS/ occasionally, but all that did was make me worry based on people being rejected with similar experience as I had.  Hopeful students were using a method of sharing their data so that a baseline could be established for people to have some sort of data regarding the likelihood of getting into the program. Acceptance I received my acceptance letter roughly 7 weeks after applying.  I quickly received other information regarding financial aid, data regarding the program, and a link to the school's academic calendar.  Looking at the /r/omscs thread, there really was no real pattern that I could see that could really indicate a real guideline for acceptance, which showed that each application received individual consideration, which was promising.  For me, my background did not begin in Software Development.  Anyone following my journey would know that I started as a manager in retail and I've transitioned over the past 5 years.  For me, some of my positives was that I did finish undergrad with a 4.0 and I had 15 years experience in different management positions, on another hand I have a friend that was accepted with a 2.8, but with all software-related experience including principal roles.  Again, shows that there are many factors and that anyone with a passion to extend their education should give it a shot.  All that's there to lose is the application fee. Final Thoughts I labeled this post as being Part 1, mostly because I haven't gone through the process completely.  I want to write about registration, staying organized, the platform and other data as I meander my way through the program.  Since I am absolutely abysmal at updating my blog, I can't say for sure that Part 1 won't be the first and last edition of the series, but I'm naming it as Part 1 in the hopes that will provide even a modicum of motivation for me throughout the months to come =)
My Experience: Georgia Tech OMSCS Part 1

Take a Look
The Beginning... When I first started my Computer Science degree program, I remember the various discussions on how and when to comment code.  Each text book that I read had different views on when and why someone should comment their code.  On top of the different textbook teachings, each of my professors seemed to have different standards on comment requirements: ranging from some not mentioning comments to some deducting points if comments were not present.  One common trend was that the quality of code comments did not matter.  My internal thoughts were that commenting in school was simply a lot of noise.  We were shown practices where we would comment everything and not necessarily in a good way.  I would see things such as: [code language="java"] // declare counter int counter; // initialize counter int counter = 0; // loop printing numbers while (counter < 10){ System.out.println("Number: " + counter + "."); counter++; }//end while loop [/code] While this code is communicative, it's also busy and the extra markup is distracting (in my humble opinion). More so, any programmer would know exactly what this code is doing without the comments.  Of course, this is pretty basic stuff, what struck me was that the comments that we were required to write in school, went against my natural inclination to communicate decisively and not just because I could.  Wait what?  Let me clarify a little.  I believe that communication is important in many situations, but sometimes communication can be more confusing when it's not clear, concise and free of extra irrelevant information.  It's like someone trying to tell you that they are ready for dinner by singing the National Anthem while inserting the words "I'm ready for dinner" somewhere within the song -- it's just extra unneeded noise.  I personally feel as though unneeded comments can play the same role within our code. So, what now? I vividly remember my Google searches on a standard for commenting code and what I found was troubling for a new developer at the time.  Within one forum or within a single resource there were many different opinions broadcasting why their means of commenting was the best.  There were folks lobbying that code should be self documenting and that comments were unnecessary in many cases.  There were others that felt that more communication didn't hurt and whatever meta data could be added to the code base would only benefit the project, not harm it -- specifically for new members to development teams.  The two sides warred with many people also falling in between at different areas of the spectrum.  The one thing that was clear was that there was in no way a specification when it came to commenting code. With experience, came clarity... It wasn't until I started working on a development team, that I started to find my own practices for code comments.  First and foremost, I tend to lean towards code that is self documenting.  I use explicit comments when there is business logic specific to that code that may not be abundantly clear to the person that is maintaining the code.  I am also primarily a Java developer so I believe in commenting in order to get all of the benefits from the Javadoc functionality.  I've found that usually if there is a need to comment sections for flow, there is a better design that can be accomplished without using comments such as breaking the code out into different classes or using private or helper methods and descriptive variable and method names to add concrete metadata to the code.  This methodology is not new and can be found in well-known software books such as Clean Code by Robert C. Martin. I've found that taking more time to think about the design of the code, leads to fewer comments being needed.  Many may think that comments aren't hindering the program in any way since the compiler ignores comments.  This is true, but comments can be easily ignored by the programmer, as well.  I've seen situations where code was changed to fit a new business need, but the comments for that code was not updated.  This leaves very deceptive code that can be more confusing than helpful.  In some situations, the original comment was necessary and the developer updating the code should have been more careful.  But I've also seen in some cases where the newly-deceptive comment was simply meta data that could have been placed in an external documentation source such as a wiki.  In this situation the wiki was updated, but the source code documentation was not. All-in-all, I believe that it's important to find the standard on the project that we are working on.  Having a specification is a helpful means of determining how code should be commented, for a project may have a specific standard that should be followed.  However, in many cases, it's up to the developer to find a happy medium in the spectrum of commenting paradigms that exist today.  I suppose that one test we can use for ourselves is to return to code that we wrote say, 6 months ago and see if we could follow it.  Is there enough information to understand the flow and purpose of the code?  Would refactoring the code make it far more clear to a new comer?  There's always room for improvement, moreover, returning to our old code is a great way test our own system of commenting. I'll leave you with this: what I can say is that my current standard for commenting is completely different than what I was taught in school.  However, it feels really good to have a personal standard, developed through my own research and experience.
My Thoughts on Commenting Code

Take a Look
It has been almost a year...  I have to say that this is the longest that I have ever gone without updating my blog.  I could say that I became very busy in the past year, as I finished out the final year of my degree program while working full time.  I could say that life just became a whirlwind as I got a new job, graduated, and moved to a new place.  I could say that I barely knew what sleep was as I pushed myself far past the limits of what I thought I was ever capable of before.  Each of these statements would be true, but none of them would really capture why I have neglected to write a blog update. The Truth... I'm going to toss aside the concrete reasons and jump into something that's a little more wishy washy. I felt as though there were many fragments and nothing substantial that I wanted to write about.  I became super critical of the topics that were coming across my mind as I filtered through the euphoria and frustrations that came with finally snagging a job in my desired field.  With many situations happening rapidly, I realized that there were many fluctuating thoughts, so much so, that my blog would seem like the title should be changed to: The Chronicles of an Indecisive Person.  Indecision has never been an issue for me, in fact decisiveness is one of my best qualities, so I had to chalk the temporary change to being a product of changing careers.  I guess I have been feeling the growing pains of moving into a new career and a new field, and I have wholeheartedly loved every second of the journey. Catching Up...  A lot has happened in the past year so I'm going to run through it in a few sentences.  I snagged an interview with a tech company, was hired as an intern; short time later I was hired as a Software Engineer.  I graduated Summa Cum Laude and just recently I moved into a new place.  Over the year, I've added quite a bit of technology to my toolkit, but above all else, I feel a sense of purpose in what I do and that's a great feeling. So, what now?  I won't make promises on updating my blog regularly, but I do have a list of interesting topics that I'd like to chime in on.  I'm currently working on a side project in Python with the purposes of really getting into different libraries and frameworks that Python has to offer.  This project is just a fun nerd project to sharpen skills and deepen knowledge, so I can see myself writing a bit about that as the project progresses.  I also plan to share my thoughts around Machine Learning, because that just fascinates me so very much.
A Long Overdue Update

Take a Look
At the beginning of the summer, I decided to purchase a Raspberry Pi module, for no particular reason other than my love of everything tech.  After reading a few reviews, I realized the potential of having something that's completely hack-able - and decided to jump on the Raspberry Pi wagon.  At the time, I was happy to be able to ssh in and use my Mac's monitor and keyboard to connect to it remotely.  I ran a few python scripts and delighted in the ability to make things blink and to tap into the GPIO board's API. Excitement, reborn... The novelty died off a bit as I didn't have an actual purpose of having the unit, apart from simply playing around with it and forcing it to do my bidding.  But recently, a friend of mine received a Raspberry Pi unit for her birthday and thus a new opportunity was born -- the chance to find an actual project to work on, this time, with a friend! My mission, if I choose to accept it... I spent my weekend reading blogs about projects that can be accomplished with the Raspberry Pi and I was excited all over again.  There were projects involving sound, media, web, servers, and so much more.  After some deliberation, I decided to get a Sense HAT and my plan is to collect data and aggregate it with numpy.  I recently started taking a data science course online, so I thought this would be a great way to collect my own data and do something fun with it.  This will be my first real project where I'm taking hardware and coding it directly so I'm really excited about that in general. Filling the gap... Ever since I decided to take the plunge to learn software development, there has been somewhat of a gap between how software communicates with hardware.  This semester, I took Computer Architecture which helped fill in a lot of questions on how what we create in code, translates to the 1s and 0s that the machine understands.  But it wasn't until playing around with the Raspberry Pi that things really started to click into place.  So, I'm ready to get to work and turn my RPi into my own personal data logging superstar :)
A Huge Slice of Raspberry Pi

Take a Look
In the past, I have spent hours watching tutorials on how to use Unity, and I've also attended a Game Jam where the engine we used was Unity.  So, although I do not consider myself a complete noob, I feel as though I do lack some fundamental knowledge that I would like to dig deeper into.  With that said, I decided to start the Complete Unity 5 Developer course on Udemy.  I purchased this course when it was on sale, at the beginning of the summer and only used it as a reference when I needed some assistance in a particular area.  But after a recent decision I made to streamline my focus (I may write a post on that later), I decided to really sit down and take this course from start to finish. I'm extremely happy about my decision thus far Usually, whenever I sit through a programming tool's training, I want to pull my hair out because of the elementary concepts that are covered in the content.  I always feel the urge to skip around and sometimes I feel as though I'm missing out on small nuggets of information that I could really benefit from.  This leaves me with a dilemma, do I sit through the boring stuff for the possibility of some new piece of information?  OR do I skip around and forgo the hair pulling in exchange for the ability to learn at a rapid pace?  However, I find that the way that this particular course is structured, I don't feel as though I'm missing out on anything if I just play it in the background while I go on my own.  If I hear something that piques my interest, I tab over and check it out, otherwise I go on my merry way.  Also, there are some good nuggets there about Game Design Documents and how to properly ask questions, which I found really beneficial. How will I share what I've learned? By no means are the things I'm learning things that I would want to put in my portfolio.  But I want to share them, so I will do that through my blog :).  After just a couple of hours (mostly spent feeling out the tools), I was able to build my first full game from an empty project to a build uploaded to my website.  The game concept is straight from the tutorial and the dialog is rather dry (I can't deny it).  But I'm proud of my little game and I can not wait for what's to come in the near future.  Want to check it out? Make sure you're in a browser other than Chrome :) and click below! Prison Game Where to now? I'm not a game writer lol.  So, I'm partnering up with a good author friend who has agreed to help me create a new Text Adventure game.  He'll do all of the writing (thank God) and I will do the programming.  I totally can not wait. Stay tuned, as always :) Want to get your feet wet with game development?  You really should try Unity, it's free for personal use.  
Join me as I learn Unity 5

Take a Look
Photo Source My Summer break has been wonderful and although I'm sad to see it go, I'm also extremely excited for what this Fall Semester has in store.  School starts tomorrow for me and I wanted to do a quick recap of what I was able to accomplish this summer.  I published an aggressive To-Do list earlier this summer and I thought it would be cool to see how much of it I was actually able to accomplish :) Here are the items that I wanted to accomplish this summer: Unity 5 Training & C# Learning Swift for iOS Learning Android Studio Blender Maya UX Design Foundation Sass Here are the items that I actually accomplished this summer: Learning Swift for iOS Learning to Test Code Effectively Practicing Data Structures + Algorithm Design Sass Foundation Speed Reading Techniques Memory Enhancement Techniques PHP Wordpress Development As you can see, I took some liberties with the list that I originally intended to complete. Mid-Summer, I felt that I needed to work on my foundational learning abilities. I have always had issues with my memory and I take copious notes to overcome that issue. I have also always had the desire to read more rapidly, although I never really thought that I could effectively become a "speed" reader, I discovered that improving my reading speed is actually a goal that I could reasonably accomplish. Since these are baseline skills, I felt that it was a great idea to work on them before the new school year began. Learning to test my code more effectively fell within the same category of foundational learning, because I felt as though enhancing this skill will be beneficial for my current internships and future ones as well! Although I didn't quite get done what I originally set out to do, I was still able to end my Summer break with a decent set of new tools that will help me along the way!
End of Summer Recap

Take a Look
I often like to read through some of Google careers information for insight into what I should be focusing on learning while still in school.  Recently, I stumbled upon Google's Technical Development Guide, targeted towards Computer Science students that are looking to get a job at Google.  This guide gives online supplemental resources for students.  In my opinion, this guide is intended to ensure that CS students understand that they will not likely be successful while relying solely on school curriculum to gain the knowledge necessary to be a developer. Let's take a peek at what they suggest... To say the very least, this guide is extensive with action items ranging from taking an Introduction to CS course to learning Artificial Intelligence, to learning Parallel Programming.  Their list seems to approach being a well-rounded developer from two angles: 1) Gathering technical skills and broadening programming language knowledge and 2) Gaining experience working in team environments and on teams outside of usual school structure. What does this list entail?
  • Take an Into to CS Course
  • Code in (at least) ONE object-oriented programming language (C++, Java, Python)
  • Learn other programming languages: JavaScript, CSS + HTML, Ruby, C, PHP, Perl, Shell Script, Lisp, Scheme. 
  • Test Your Code
  • Develop logical reasoning and knowledge of Discrete Math
  • Develop a strong understanding of algorithms and data structures. 
  • Develop a strong understanding of operating systems. 
  • Learn UX design
  • Learn Artificial Intelligence
  • Learn how to build compilers
  • Learn Cryptography
  • Learn Parallel Programming
  • Work on projects outside of the classroom
  • Work on projects with other developers 
  • Practice your algorithmic knowledge and coding skills
  • Work on a small piece of a large system (code base), read and understand existing code, track down documentation, and debug
  • Become a Teaching Assistant
  • Gain internship experience in software engineering
You may be thinking, "this list would take a life time to master".  In many cases, that is the truth, but I think the goal is to have a decent understanding of all of these areas then use that knowledge determine an area to master.  For instance, I plan to specialize in Artificial Intelligence in grad school, but it's still important for me to understand the other areas because they all work together.  Regardless, this list gives us a glimpse into what Google expects from future Software Engineer applicants.  Google accompanies their list with links to online resources that students can use to accomplish these tasks.  I've highlighted in blue the tasks that I have worked on since beginning my CS degree program.  I did this to demonstrate just how obtainable this list is, especially when tackled over time. Bottomline...  I believe the biggest takeaway in this situation is that students shouldn't rely solely on their school's curriculum to give them all of the knowledge they need.  I have been an advocate of supplemental learning and have mentioned it in many blog posts before this one.  What's more interesting is that supplemental learning has gone from being a way to be competitive while job hunting, to being an expectation for many successful organizations.  As technology advances, developers will need to have a broader skill baseline in order to be successful.  Personally, I believe this Technical Development Guide is a tool that any aspiring developer should use, not just ones that want to snag a job at Google!
Want a job at Google? Google’s Technical Development Guide!

Take a Look
Photo Source Two months ago, I spent a week or so learning how to build a Wordpress site.  As a part of my post-mortem, I identified some performance issues and things that I would have done differently.  As I'm taking some time to review previous projects, I am taking the time to tackle a big issue of my site so far -- performance. A major part of the lessons I learned after creating my site was how quickly a Wordpress (or any) site can become bloated and have bad performance.  I'd noticed that my site took a lot longer to load than I'd like, so this weekend, I am carving out some time to tackle the issues with the site so far. My benchmark...  I was pleased that Google rated my site 99/100 for User Experience.  This was a pleasant reward considering I had user experience in mind the entire time that I was building the site.  However, my Speed results were an abysmal 43/100.  One of the major issues was render-blocking CSS and JavaScript, with a few images that were uncompressed and unoptimized.  I was able to fix the image issues immediately, which bumped my score to 59/100 on both mobile and desktop.  However, the other issues require a big of digging on my behalf. Where to go from here... Now that I've identified the issues, I feel as though I am well on my way to correcting them.  Here are some tasks things that I will be doing in hopes of improving performance overall: 1) Reformatting my stylesheets:  I have one gigantic stylesheet that is a mess of issues, which was identified in my post mortem.  Although I usually code neatly and with a purpose, much of the piece-meal formatting of my style sheets came from me not fully understanding how Bootstrap + Wordpress works together. 2) Testing my CSS: I installed CSS Lint to run tests on my CSS code and the first test revealed 3 errors and 143 warnings.  I will fix these warnings and errors, but I will also take this time to re-organize my style sheets to make far more sense than it does currently. 3) Broken JavaScript files:  I have a couple of errors in my JavaScript files caused by updates to some plug-ins.  I will work on getting these errors corrected. I believe this is a really good place to begin.  From there I will continue to use Google Page Insights to increase my page speed.  I believe there is some serious refactoring to be done on my part, and use the knowledge that I've gained over the past few months.  Very exciting times, indeed!
Optimizing My Site: Google Insights

Take a Look
The situation... Recently, I have been preparing to get another internship to replace my Administrative position.  I am aiming to submerge myself into programming and put as many hours into coding as I possibly can.  I currently have a "spare-time" Internship on a game development team, as well as a part-time Administrative position that allows me to work from home or anywhere with an Internet connection.  But since I changed careers two years ago, I have felt as though I wanted even more exposure to coding, so lately I have been preparing to obtain a programming position to replace my current part-time Administrative position.  (Don't worry, my boss knows and supports me completely lol.) My fears... Over the past few years, I have read so many horror stories of hiring managers conducting interviews with recent Computer Science graduates, only to discover that they aren't able to code their way out of a paper bag.  I have heard stories of the dreaded programming tests that accompany many programming positions.  These fears, in part, are what drove me to do self-learning on top of my degree program.  Above all else, I read (A LOT) and practice 10 times as much as I read.  However, no amount of practice has been able to squash my fears around the dreaded programming interview test. What's my solution?... More practice. lol. However, I have been practicing with a purpose.  I have been focusing on interview-specific algorithms and timeboxing myself to overcome the shakes that I get with just thinking about programming on the spot.  I spend a few hours a day implementing different data structures, practicing kata on code wars, looking at the implementation of different data structures within different programming languages, and pretty much living and breathing programming. So, what about Python?... Yes, python.  I originally fell in love with C++ as my favorite language after taking a C++ last year.  But after a few different events, I was exposed to Python.  First, there was me joining Code Wars, which didn't have C++ as a language option for code katas.  Then, there was my interest in scripting languages in general after reading requirements of different job openings.  Finally, there was the announcement of one Maryland's major Computer Science programs moving to Python to teach new students. Armed with this information, I started to practice Python about 4 months ago.  I have read a bunch of resources for interview tests and just yesterday I made a repo for my solutions to these problems.  This repo is my means of tracking changes and bugs and making improvements along the way!  If you haven't gathered yet, my primary means of preparing for these types of interviews is lots and lots of practice.  Personally, I don't think there is a better way, and I also believe that Python is a great language to use for this purpose! Happy Coding :)
My Programming Interview Preparations

Take a Look
It's that time again... the usually dreaded time to return to classes.  This time around, I have mixed feelings regarding the start of my final Fall semester.  On one hand, I am holding on to the tiny bit of my summer vacation.  But on the other hand, I am more than excited to begin this semester, if only because of the classes that I will be taking this time around.  Here's my Fall semester lineup:
  1. Data Structures and Analysis
  2. Computer Systems Architecture
  3. Linear Algebra
  4. Advanced Programming Languages
  5. Object Oriented Concurrent Programming
I also plan to supplement my learning with a couple of free MOOCs:
  1. Algorithms 1
  2. Software Testing
As usual, I have piled my semester with tons of fun and plenty of things to learn.  This semester will be special to me because I will be taking the bulk of my Computer Science core classes.  As I took some time to re-read the course descriptions, I could feel the excitement rising because much of the gaps I've felt lately, will be addressed this semester. Let's discuss these "gaps"... A huge part of my studies has been self-taught.  Although I am attending a university in order to get my degree, a large portion of what I know now, has come from countless hours of practice, reading, and completing MOOCs online.  While stumbling working my way through my self-learning, there have always been areas that I felt would have been more clear had I gotten to that point in my formal education.  Or, in many cases, the resources available teach a watered-down version of a subject, which left gaps in general understanding.  In these situations, I found myself seeking different sources of information to fill in the gaps, but sometimes, the information still was elusive at best. I know that school will not fill in all of the gaps, but I do feel as though this semester will provide me with a more in depth guideline to follow in order to deepen my understanding, specifically around data structures and algorithms. So, onward I go to my next to last semester of school!  
Back to School: This Semester’s Classes

Take a Look