By Theresa Cay, Current Spring 2015 Software Engineering Fellow
“She was unstoppable. Not because she did not have failures or doubts, but because she continued on despite them.”
— Beau Taplin
Week 1
◊ Logistics/ What to Expect
◊ Intro to Command Line
◊ Conditionals and Looping
◊ Git/ Github
◊ Functions
◊ Lists, Tuples, and Sets
◊ Computer Memory
Day 0
Saying I was “excited” on the first day of Hackbright would be the understatement of the year. I finally felt like I was on the right path and couldn’t wait flip to an empty page of my new chapter in life. Two BART stations and a 10 min walk later, I entered Hackbright’s halls.
Breakfast and refreshments were provided starting at 9:15 AM and I settled into the tables with my fellow classmates. It was so refreshing to finally get to see everyone in real life and match faces to our introductions from our Google Group. Once it hit 10:00 AM, we headed upstairs to a more open space. We initially placed ourselves in a circle. As I looked around, there were still so many people I haven’t had a chance to meet! Our get-to-know-everyone game was placing yourself in a spectrum of Yes to No based on a series of questions. There, we got to see the wide variety of science to non-science backgrounds, our hobbies (DJ, deep sea fishing, and roller derby, to name a few), how far we’ve traveled to attend Hackbright, etc for ourselves.
After a good amount of laughs, we went over to our lecture area, which had comfortable reclined seats placed in neat rows on the shag rug and were bordered by outer, large couches. We were then introduced to Balloonicorn, our awesome mascot, and our instructors and TAs, who gave us an overview of the rules and regulations of Hackbright. I appreciated that the logistical information was given in a very clear manner. I felt confident in what to expect for the duration of the program in addition to what was expected of me.
To end this part of the day, we counted off from one to five. This divided our cohort equally into Hogwarts Houses (Gryffindor, Slytherin, Ravenclaw, and Hufflepuff), plus Dumbledore’s Army. There’s a total of six women in my house (Gryffindor, represent!) and I couldn’t have asked for a better team. We paired ourselves within our house for our first pair programming exercise, Blockly!
Pair Programming
“They say patience is a virtue.
I wish someone would have told me that sooner”
Blockly is a series of simple games to gently introduce programming concepts. We were instructed to complete the Maze portion of Blockly, where were tasked to lead a person from a starting location to an end location by stacking a limited number of blocks. The types of blocks include: move forward, turn [left, right], repeat until end goal- do [next block], if path [ahead, left, right]- do [insert next block], and if path [ahead, left, right]- do [next block]- else [next block].
My partner and I breezed through the first nine levels, which were pretty straightforward, but had a difficult time figuring out the last level (pictured above). The yellow person would get stuck at at a dead end, walk in an infinite circle in the top left corner, or go down the wrong path. We took turns being the driver and navigator and talked through our endless proposed solutions, none of which seemed to work.
Two steps forward, one step back.
Well, not literally in the game, but mistakes meant progress. It turned out the yellow person needed to take a stroll down the wrong path to get to the finish line. We gathered once again in the lecture room the next day to review the solution to this maze, called the Left-Hand Rule:
Until the exit is reached:
- If you can turn left, turn left.
- If you can go forward, go forward.
- Otherwise, turn right.
Since the walls of the maze are connected, the player is guaranteed to reach the exit if he or she follows the left-hand wall. Now why are we learning about maze learning? Other than to start thinking algorithmically, acyclic mazes are analogous to trees in graph theory in computer science and can be applied to searching through file systems.
Eat. Sleep. Code. Repeat.
The schedule for our typical day is:
10:00 AM — Morning Lecture
11:15 AM — Lab Exercises/ Pair Programming
1:00 PM — Lunch
2:00PM — Afternoon Lecture
3:15 PM — Lab Exercises/ Pair Programming
4:30 PM — One-on-One Advisor Meetings
6:00 PM — Day Ends
With this schedule, the remainder of the week went by so quickly! Each day is a mental marathon. I soak up new information in lecture and have the chance to let it sink in and cement itself during our lab exercises. Although it’s tiring, it’s incredibly fulfilling to leave Hackbright mentally exhausted.There are days where I feel like the person on the left in the XKCD comic, and there are other days where I’m the person on the right. Either way, I’m always eager to start the next day.
$ help
$ mkdir HammerTime
$ chmod 500 HammerTime
$ cd HammerTime
$ touch this
I’m bashful* to admit this was my first time learning about and using the command-line interface over the typical graphical user interface. This honestly was life-changing and opened up a whole new world for me. It’s clear, direct, quick, and easy to use in comparison to the GUI. Clicking and dragging files to the trash bin (which is just changing the location and isn’t getting rid of a file), then emptying the trash bin seems so tedious when you could just type a concise, one-liner:
Boom. Done.
Some might be concerned that there’s no “undo” option this way, but hey, you just gotta live a little (or just double check the full contents of the file beforehand using the cat command, which is short for catenate).
There’s a command for everything and anything you could think of, and I still have so much to learn. I practice these commands by making and removing directories, moving and renaming files, etc. on my laptop at home. Initially, I was tentative when pressing enter for each command, but now I’m finding that it’s becoming second nature to me.
— — —
* this section was just asking for it.
gc.collect()
and the black magic that occurs under the hood
Although some people thought the lectures on memory were dry, I thought this information was incredibly interesting. What does go on under the hood? How do these fundamental processes work? How does memory allocation from your code compare when you scale up with larger data as inputs?
We started from the beginning with bits and bytes and reviewed how much memory certain types of variables took. We discussed older languages which require the programmer to explicitly say what type of variable will be made. This is done so it can allocate the proper amount of memory, which is fixed in place, to the variable. Afterwards, we compared those languages to Python, which does not need a variable type declaration. Python is flexible and instead has identifiers, which are names that point to a spot in memory. These identifiers can then be reassigned to point a different value type in another location in memory.
Our instructors used the blackboard adjacent to the projector screen to give a visual representation of what occurs when variable names are bound/point to values.
This increased my depth of existing knowledge about various data types. It explained why some were immutable (strings, numbers, tuples), whereas others (lists, dictionaries, sets, objects) were not. Furthermore, we discussed possible future issues that may arise (e.g. the case above with two variable names pointing to the same list — if you change my_list[0] = “avocado”, the result of your_list[0] will be “avocado”).
Once the program is completed, Python runs its garbage collector to free up memory space from unbound objects automatically (but you can use the gcmodule to force garbage collection if you wish). Overall, learning about memory management helps me have a better understanding of each level of being a software engineer.
git init
“Everything not saved will be lost.” — Nintendo “Quit Screen” Message
Along with the CLI and memory management, I’m forever a changed person from git and GitHub.
I’m committed* to never forgit** this particular pearl of wisdom, which was repeated countless times at the beginning of lecture:
Git is a program. GitHub is a company.
Version control is definitely a game changer. It’s so helpful to track meaningful progress and is reassuring to have the option to revert back to a previous state (because let’s admit it, just like anything, mistakes will be made).
Reminder: Be kind to your future self and commit substantial improvements with descriptive messages. Comment your code as well!
GitHub is particularly exciting for me because it makes programming social. As I said from my previous post, My Journey to Hackbright, the scope of who I can interact with is one of the most important aspects I love about programming. There are so many open source projects available to work on. From personal projects to large organizations like NASA, I can’t wait to contribute to different initiatives with people from all over the world.
— — —
* sorry.
** not sorry. ← (P.S. Stop apologizing for everything!)
This post was originally posted at Theresa’s blog.
We’re currently accepting applications for our upcoming Summer Software Engineering Fellowship. Submit your application and become a software engineer with us this summer! Deadline to submit is April 30, 2015.