Wednesday, June 12, 2019

Hired!

After over 14 years at home raising a family, I am officially hired (been mostly on contract or temp positions since December). It is in a great industry (entertainment), the company treats their employees well, the other employees are not insane, the bosses are human, and the benefits are awesome. 
It came with a pay increase so now that I can afford to, I will not be rushing through the end of the degree. That means instead of just learning what I need to finish Software 2, I’ll be working on the Udemy master course that’s been snoozing in my account. I’ll also make capstone something I would want to show off in GitHub.
I've been programming in cycles of: try this, if it works move on, else backtrack to when it was working and try something else. I’m hoping the course breaks me out of that mentality and give me the confidence to work through my bugs or at least figure out what piece of code caused the break.I don't know if I'll use Java for capstone but I need an actual class and I've only heard good things about Buchalka. 
I'm forcing a break because I need to break out of that constant rush mentality. No more worrying about running out of time and money; I have enough of both (now) to get me through another term if needed. 

Thursday, June 6, 2019

C950 Data Structures and Algorithms II


I did it! I passed! And I'm not officially qualified as a candidate to Georgia Tech! I have 12 weeks left in my term so the following is just my reddit post. I'll come back to add other thoughts and details when I have more time to myself.  

WARNING: This is long. It was mostly written for those who learned how to program by completing Software I/II at WGU and need a little perspective by the time they reach this point. Remember, I just stared programming a few months ago so if you have a lot of experience, don't expect to be enlightened by my post.

This project tests your ability to take a very large set of constraints and requirements (some of which make very little practical sense), implement them into a design, and code that design to work within the scope of the project. I think I'm finally feeling confident enough to start a portfolio and would if my end of term wasn't approaching so fast. If you are a beginner, I do recommend taking Software II first to get more experience with OOP and putting a multi-component program together. I took this first because it was the last one I needed to qualify for Georgia Tech and I wanted to make sure I got it in before the end of my term but plan could have easily not worked out.

There are some students who built the project way beyond what I considered the scope. There's a lot of interpretation involved, but keep in mind the business aspect and remember they are a small company that delivers 40 packages per day and only have plans to expand in the future. There are things they need now and things they will need for expansion. Are they really going to have the money to invest in extra bells and whistles to accommodate expanding additional cities and whatnot? For a lot of things, it only needs to be designed to allow for future updates (especially for planned expansion), and these are points you'll argue in your paper.

This is the heart of BSCompSci for all CompSci programs. It's a matter of setting priorities and being organized: both in completing the project in general and in executing your solution of the problem and constraints. Break down the problem into some general segments, then break that down further into sub-segments and various tasks (similar to the check list in Software I).

If you are just starting to work with Python, you're going to want to read

Below, I flesh out how I broke down my project to demonstrate how it can be done. Some of my pieces might not make sense depending on how you perceive the problem and how you decide to design your program (the design itself is pretty open-ended which is part of the challenge). I read the scenario as a data problem and reduced it to data that can be stored, retrieved, sorted, calculated, and printed.

That said, if you follow what I did too closely you're going to have a bad time because some of my decisions came about because of how I interpreted the problem, how I coded my project, and the odd twists that lead me to the next part. Remember, I'm still a beginner programmer so there is likely a better way to get it done. I just wanted to write this out for those of you who can't figure out where to start ... break it down and simplify. Remember, your project is going to be built differently so if you use too much of this as a guide, you're going to get stuck as it may not align with your own thought process, flow, or coding techniques. That being said .... here is my breakdown:

Data Structure Stuff:
  1. Build hash table. Zybooks was really good for this part. Pick the one you like, keep in mind you'll need to justify your choice in the paper.
  2. Get csv data into the hash table
  3. Format distance data to suit the data structure you want. You have a few options. A lot of students build some kind of graph. https://www.youtube.com/watch?v=th00zpkPM9Q&list=PLC617CBC8385356FF
  4. Build data structure for packages and distances (the rubric tends to refer to both as package data so it's probably safe to write about both when asked though it probably wouldn't hurt if you picked one and talked about that)
Note: while Python implements dictionaries as hash tables, our assignment is to build a hash table from scratch for the package stuff. I used DictReader for the route stuff.

UI parts:
  1. Look up package data
  2. Insert new package/data
  3. Print all package data at a given time
  4. Print route with mileage data

Algorithm:
There was no breaking anything down for this one except picking one and implementing it. This was one of the times I just had to pull samples apart and put them back together until I could get one running. I found nearest neighbor easiest to understand and model. Dijkstra is really popular because there is an example in the book that makes it easier to implement and I know one person who implemented brute force.

I manually separated the packages into 3 sets (with the help of excel because I'm an excel junkie ... I switched back and forth between sorting by address, delivery constraints, and truck sort to decide what package was going on what route). After I had 3 lists of packages, I ran it through nearest neighbor. Most students opt to program this part into the core algorithm.

... I'm not sure how common it is, but the path determined by my presort and algorithm ended up meeting all requirements (about one of the only things that worked out unexpectedly well!). I saved the things I originally planned to do in terms of optimization for my 'what I'd do if I did it over again' part of the paper. I reasoned that since the company was using csv files, management (or whomever they use to add the data into Excel) can do the initial sort in Excel. I plan to go back to this project after graduation to create a sorting program to replicate what I did in Excel.

Because I worked out the performance of each route did in Excel (delivered time, etc.), I was able to take that experience and translate it into python. The final bits were creating truck objects, having them load the packages and run the algorithm for deliveries. I used those actions to determine the status of packages, start, and end times. This was my outline for figuring out those parts:

Other algorithm tips (not from me):
This info came from a student in chatter who ended up with 76.1 miles. If your presort doesn't match muster or if you think it's too much of a hassle to sort by hand/excel, this was HIS general method: "First part removes all non-deliverable packages. Second part loads all urgent packages. Third part randomly loads packages in several dozen sets. Fourth part recursively checks each set from the third part for lowest mileage, route path, and route weights. Fifth part takes the best data from the fourth part and uses that to cook the route/weights into the truck class. Finally, truck leaves the hub and begins deliveries. Optimization for each part includes loading addresses that share the same address as packages loaded onto truck, unloading non-urgent packages in truck if it exceeds capacity, and throwing out routes if any packages do not get delivered on time."

States, Actions, Limitations:
  1. Truck Limit - 16 packages per load
  2. Package status is either AT_HUB, IN_TRANSIT, or DELIVERED
  3. Truck
  4. Time:
  • Note: I'm pretty sure if truck 2 has 16 packages and leaves after 9: 05 AM, it will not return until after 10:20
  • Every package with a deadline needs to be delivered on time! It helps to have a list for the paper.

For the time component, I kept mapping out what the program was supposed to do and what I needed to get the things that would indicate those things. I started with travel distance and converted that to time. In Excel, I found the difference between the start and end time of each route. From there I was able to figure out how to iterate the time and mileage values for each individual package and during the route (need a cumulative sum to find a package's place in the route). This seems to be a simpler implementation than others who have passed the class (the program acted more like an observer in which events 'happen' linearly as in the 'other algorithm tips' above). I'll chalk off my interpretation to my beginner status. The jury is still out on whether my method is scalable for calculating delivery times and setting the status.

Again, try not to tackle more than one issue or component at a time. If you're getting overwhelmed, you're probably trying to do too much at one time. Take a step back and figure out what you need first, then limit yourself to working with that. Break it down until the only parts left are simple.

The Writing Part:
The writing component is incredibly ambiguous; you need to combine the instructions with the rubric guidelines to make sense of it. I pasted the instructions into a document and used the various sections as topic headers. Then under each header, I pasted the rubric stuff (in italics). I highlighted them a really ugly color so when I was working on it, I could easily tell if I were done with the section or not (removed highlighting when done).

Some of the sections are basically asking for the same thing; it's ok to copy something from one section and paste it into another. For example, there are two places that ask you to verify that each package was delivered on time. Yes, they want it again; no, you don't have to reword all the iterations of the same question. Some sections ask for things that aren't included in the scope of the project; for those I said: the current software requirements don't include ___. For example, there was one section that mentioned hosting of the environment. For brownies, I followed up with: implementation of that feature would require ___. It was helpful asking about sections on Slack and discussing how everyone else interpreted the question and how they answered it. There were variations and all were accepted.

Anyway, I was nervous about the complexity analysis because I wasn't sure how well I understood it (I would not be surprised if I got some of it wrong). I took my best guess for each function in each script (in a note), then created tables for each script in my paper where I listed the line #, space complexity, and time complexity. At the bottom of the table I added each line, then put it in Big O notation. Here's a short example:

buildhash.py
Line #
Space Complexity
Time Complexity
11
O(N)
O(N)
20
O(1)
O(1)
38
O(N)
O(N)
52
O(1)
O(1)
Total:
2N + 2 = O(N)
2N + 2 = O(N)

Once I did that for each script, I replaced line # with Script Name and listed the results. Then I added to get the total N's and converted it back to Big O notation ... I didn't go into that much detail for the core algorithm overview. For that one I just put the overall Time and Space complexity in a section of my overview which is in the sample the mentors give us. I think they would notice if you had a sort function and the complexity didn't include a log function and things of that sort so I wouldn't attempt to put in random values. Do your best.

Anyway, I'm down to 3 courses: Software II, Introduction to Artificial Intelligence, and Capstone. Woot!

Wednesday, May 29, 2019

Algorithms and YouTube

No cohorts for c950 Data Structures and Algorithms II! That cost me $70 to get in some practical python 3 practice. On the advice of another student, I purchased a course (Jumpstart Python by Talk Python) that walked me through 10 programs. Most of it was solid but I ran into a few issues where he didn’t mention a line so my code didn’t work until I compared what I had with the GitHub and found the bit left off. One of the programs was outdated because the website he was scraping had an update. So he reconciled that by adding a note to use other code instead which made me not want to recommend the course to others ... for $70 a pop, you can redo 5 minutes of video!

It seems to be part of that issue I’ve been having where people explain things as if I already knew what they knew ... from books to lectures to people on slack. He assumed everyone watching could see new code and translate it into whatever he was talking about. I couldn’t ... This weird tendency to assume I know the answer to the question I just asked is sooooo rampant in BSCS that I started to avoid asking questions. Every once in a while I’ll mention that the explanation would be helpful to someone who knew more than me but it’s often followed by more unhelpful advice. More often than not, I regret having bothered.

I decided that one of the things I’m going to do is make some YouTube lectures for this (and other courses eventually). This one is pretty important because we otherwise have no help unless we manage to magically mesh something together, submit it, and get it returned for revisions. That’s the ONLY time a mentor is allowed to look at your code which is a horrible way to learn DSA2, the most important course in ANY CompSci program. This will have the added bonus of helping me convince WGU that I want that teaching degree; I figure I can include a link to my channel as part of my application.

Anyway, I started being more active in the Braille community. I’m hoping to take on some projects once I graduate BSCS. The Library of Congress still hasn’t released their Nemeth certification course for UEB yet so I’m part of a growing number of rogue transcribers. But, I need to keep those skills fresh!

I’m thankful for chocolate covered strawberries. Long story, lol.




Thursday, May 16, 2019

C188 Software Engineering

This class was a lesson in procrastination. I came up with the 5 requirements and picked a CRM. Then the project sat for a week (I had meetings after work that week). By the time I got back to it I finished in two days.

I went about this one backward. I picked a CRM first, then I found the requirements that it met. Around that time I built a scenario around why those requirements would be needed. I wrote up unit tests next. Then I worked on the introduction, scope, etc. Of course the last thing I did were the visuals ... I need to take a serious course in data visualization sometime.

One thing I wanted to note about performance assessments in general. There is some leeway when it comes to working with the scenario given. As long as what you're writing doesn't explicitly contradict the scenario, you can make assumptions to help argue a point. For instance, you can say that documentation is important to a company or that documentation is not important to a company and both assumptions would be accepted (just don't claim both in the same paper, lol).

I keep going back and forth between wanting to finish the degree or just withdrawing at the end of my term. I'll keep considering my options. I can't figure out if I'm more likely to get accepted into the math program if I finish it or if I withdraw from the program, lol. I wish they'd tell me what they want. I just want to study math.

I also want to help figure out a way to teach advanced math to visually impaired students. My current path is B.S. Computer Science to B.S. Math Ed to M.S. Computer Science to M.S. Special Ed.

Monday, May 6, 2019

BACHELOR OF SCIENCE Mathematics Education (Secondary)

I met someone the other month that contradicted the reason WGU gave me for not allowing me to enroll in the math program I wanted. Even the website says this leads to licensure and they said I needed one to get into this program.

I don't understand why they had to be dishonest about their reasons for not letting me switch degree programs. I have a legitimate reason for wanting to study math: I am a Nemeth braille transcriber and my current level of math limits the types of books I'm able to transcribe; I also want to eventually pursue teaching mathematics to VI students (when I'm ready to wind down whatever career I end up with). So I'll try that again when I convince them I'm not planning to finish BSCS at WGU, either because I finished it or because I withdrew.

C482 Software I

This is one course in which all the work I did over spring break really paid off. I had completed SoloLearn's Java course and watched Bucky's Java and JavaFX tutorials. I also went over Jaret Wright's SceneBuilder tutorials which really made up the bulk of the work. By the time I started this course, I was able to jump in after watching the cohorts (I built the GUI first because that was fun).

I think I thought the programming was the easy part until I hit the last 20% of the requirements. I started to put in a lot more hours than I normally do and managed to finish in under two weeks (closer to five weeks if you count the work I did over term break).

The mentors give us a lot of code samples in the cohorts that made up a lot of the pieces we need for the project. I spent a good deal of time pulling those apart and putting them back together a few times to make them work for this project. I had to redo the entire program a few times before I build a solid enough skeleton to just keep building. But I think that's not unusual for someone who is still really new to programming.

I think for the most part, I still consider myself a quilt programmer. I can take various pieces of code, edit it to work for my situation, then stitch it all in the right place. It's a lot more involved than what I did in MSDA for sure (you can't do this kind of quilting without a solid understanding of what the code does and how to make it work for your situation). However, I'm not feeling like 'a programmer' just yet. I don't think I could do a lot of it from scratch or figure something out without seeing how someone did something similar to what I was aiming for.

I'll be working on this after my term ends. I want to feel like a competent programmer before applying to Georgia Tech and since their deadline moved from September to July, I'm now aiming for July 2020.

C191 Operating Systems

This course was supposed to last a week because I had completed the bulk of the reading over term break. I finished this five weeks after my term started. Most books on the subject is filled with so much jargon, it took a while before everything started to sound like English.

I eventually ended up creating a test bank with all the questions on sanfoundry (that website doesn't shuffle the questions or answers so it's easy to remember where the right answers are without actually learning the right answer, lol). It took a few days to debug it but working on that helped solidify the terms I was getting mixed up. It also clarified the concepts that didn't make sense because I was getting certain terms mixed up. So it was a good experience and I hope the bank helps others.

I think the exam for this one throws in a little too many oddball questions that I can't imagine most people being able to retain from 900 pages of text. They aren't challenging questions, they just weren't related to any of the major points or any of the overviews we get with the course materials, things that you wouldn't think were important to study thoroughly.

Anyway, I'm glad this one is finally done. I started going over OS topics back in December so I spent A LOT more than five weeks on this course, about four months total though only the past 5 weeks consistently. I think when my term is complete I'll give Operating Systems: Three Easy Pieces another read. That was more helpful in understanding what this class was supposed to teach me than any of the materials we were given or recommended lecture sets.

Here's the test bank link again - http://www.quizsail.com