Internships and Capstone

Long time no see. In the last two months a lot has happened. I interviewed at seven different tech companies for software engineering internships, I got an internship at Chef Software, I developed and deployed Lights on WA, my a capstone project, and I saw the grand canyon for the first time. So it’s been a great couple of months.

Internship Interviews

Ada Developers Academy has great selling points, but the two that definitely make it rise above the fray are the facts it is free and that there is a built in five month internship for those who go through the program. The internship is critical as it gives you real world experience at a local software company before you have to start the job application process. It also gives you the opportunity to apply and do technical interviews with the guarantee of a job at the other end before you have to do more high-stakes interviews which is amazing practice. We were all a little more than nervous for our week of seven technical interviews and knowing that at the end every person would get an internship made it a lot easier. I interviewed with a range  of different companies both small and large. Some of the interviews were purely technical, some situational, some just talking about why I was interested in coding. All of my interviews were positive experiences, even though I came down with a cold and was pretty ill and could barely speak or get the ringing out of my head at the beginning of the week. Technical interviews can be scary for people coming from different fields. In a lot of cases it’s basically someone asking you a logic puzzle and watching you speak and write on a whiteboard while they judge you on how and if you solve it. There’s a lot more to it than that but it can often feel like a quiz. It’s really about how you build trust and candor with the interviewer in a short amount of time and do so in order to solve a complex problem. Some people also just like to see how you react when you draw a blank — do you panic? do you pull through? So any situation in which panic is an option can be stressful.

I ended up appreciating the interviews and to my bemusement found that the ones with harder questions and interviewers that pushed me to think more deeply about efficient solutions were the interviews I enjoyed the most. I am happy to say Chef was one of those interviews.

In order to make interviews less daunting and more silly our cohort added some little traditions to the process. We all wrote each other notes to be opened before each interview and had a costume box where we dressed up after each interview and took disposable camera photos.

IMG_7622.jpeg IMG_5096

About two weeks after our interviews were finished we found out our placement companies. I was overjoyed to find out I’d be interning at Chef. I had found their interview engaging and challenging, they are a remote company, they pair program, they are a DevOps company which is a deep area of interest for me, and they are Open Source.

Funny enough the morning I found out I’d be interning at Chef, I met up with one of the Adies who works there now for coffee. I am excited that two people from the program are already there as full time engineers and love the company. It has been hard to explain exactly what the company does to my family and non-tech friends (all my friends) but for most software people Chef is a leading name in DevOps or Development-Operations. They produce software for software companies that makes the deployment and configuration process easy and even fun. The only friend of mine I know in tech was very excited when I told him this is where I’d be interviewing as he handles the Chef recipes at his job. Chef is written in Ruby (yay!) and a functional programming language called Erlang. One of my goals and wishes for the next six months has been to learn a functional programming language so I’m excited for the challenge. Chef’s frontend will also be a challenge for me in learning Angular 2, which is brand new and daunting. I’ve already started to learn a little Erlang and transfer to the text-editor Vim over the last week and it’s a whole new world to me. Our cohort has three weeks starting tomorrow to “ramp up” before internships start in April. I’ll be using that time to dive into more Ruby, Chef Recipes, Erlang, and Angular before I start.

Note: I also found out last week that I was accepted as an Opportunity Scholar for Railsconf and will be attending in May! Chef is a sponsor so I hope I’ll get to see Chef employees from different parts of the country there.

Capstone Month: Lights on Washington

And all this brings us to Capstone Month. After interviews were done we quickly started working on our four-week individual projects. However daunting, capstone proved to be the most fun I’ve had at Ada (don’t get me wrong, it was all fun!) I have been incredibly impressed with all the ideas and deliveries that my cohort pulled together over these four weeks.

My project started with thinking about campaign finance in the Washington State. I wanted to make donations and candidates more transparent. So I decided to take the data from the Public Disclosure Commission, which controls campaign finance in our state, and make it more accessible and host it on my own site. Easy, right? Well, public data is a lot more complicated than that. My first big problem was that I didn’t have easy access to the data. A public records request I put it took 3.5 weeks to come through. I had to build a web scraper to get all the data from the site.

Once I got the data and had a basic front-end with the help of some amazing Javascript libraries, the main problem and majority of my time was spent figuring out how to get so much data into production. I dealt with a litany of memory leak and performance issues that we normally don’t see in our Ada projects because we are dealing with hundreds of rows of data (if even that much), not millions.

In interviews we talk a lot about space and time efficiency without any practical experience about when this might be applicable. We tend to think that it’s just for interviews that we need to know the run time of different sorting algorithms. Through working on Lights on WA I started to see the immense value in having a basic understanding of memory, space, efficiency, and algorithms. I talked some about this in the presentation I gave on our final day. The slides can be found below and the website at lightsonwa.com.


I was very proud of how Lights on WA turned out. I talked to some friends working in politics in Washington who were enthused to pass it around. I am also proud about the fact it is a civic hacking project and that I learned how to get information from the government when they are slow to deliver a public records request. I definitely want to stay connected to the open data world that I experienced a little slice of and would absolutely participate in more side projects that had to do with making our data more accessible. Finally I am proud of how much I learned about performance and data structures. I am proud that I used the resources available to me to finish and exceed my MVP. The whole process gave me a lot of confidence in my skills and made me excited to dive deeper into DevOps in the coming months.

After internships interviews and capstone were complete, I got the opportunity to visit my family in Arizona and see the Grand Canyon for the first time. It was so beautiful I was breathless (and not only because of the 12 mile steep hike). I got to see sunset and sunrise over the canyon with my best friend, and take a second to breathe without thinking about runtimes or Travis failures. I return this week with a new sense of learning and optimism, which I’m really going to need as I go cold turkey off Sublime in my switch to VI.
IMG_6799.JPG
IMG_6805.JPGIMG_7642.jpeg

Winter Break and Advent of Code

This winter break I gave myself the project of becoming more proficient in standard Ruby (sans Rails). In order to do this I did a bunch of coding challenges. One of the sets of challenges I tried was an Advent calendar made up of coding puzzles.

I wanted to write up a blog post about what what I learned about Ruby from gaining all 50 advent of code stars. I did a great job of erasing all Rails from my mind this break and concentrating on my programming fundamentals and use of Ruby. This will probably hurt a lot when I return to class on Monday but it also helped to cement things I’ve learned so far and teach me new things about programming. So here are a couple of things I learned from this winter adventure.

Screen Shot 2016-01-02 at 6.14.17 PM.png

Advent of Code is a 25 day challenge leading up to December 25. It’s a fun project put together so that it’s accessible for all skill levels and can be completed in any programming language. I am definitely bookmarking AoC for when I have to learn a new programming language. I tried the first five days in R and Ruby and it helped me relearn a lot of the R I’ve slowly been pushing out of my brain. My GitHub repo of AoC can be found here. This is not the prettiest code in the world and there are definitely exercises I’m more proud of than others, but regardless of code quality it’s something I finished and I learned a lot in the process. Here are a few of the things I learned.

1. Range of CS-Related Topics

What I really liked about the layout of the challenges is that most touched on a range of topics in the development world. One challenge took advantage of parsing JSON files, something web devs would know a lot about. One talked about MD5 hashes, and another about password encryption, which relates to cybersecurity. There was a challenge that related to hardware, one for bitwise operators, and lots of interesting sorting problems. It was a fantastic array of subjects to learn about for someone who has only been programming for a little while. I learned a lot about Regular Expressions as many of the puzzles had to do with large amounts of string input. I also was able to brush up on my math for the puzzles that involved coordinates. Overall, once you have the basics of a language down, doing coding puzzles like this can really help introduce you to CS topics when you did not go to school for that. The one area where my background in economics helped me was on an optimality constraint problem where you calculate happiness of guests based on who they are sitting next to. But besides that, I was pretty lost when solving problems with “jumps” and “registers” and learned a lot in the process.

2. Every Language Has Strengths and Weaknesses

During my three weeks of working on Advent of Code, I spent a lot of time on the AoC sub-Reddit reading about how people saw the problem and looking at code in Python, Java, C#, C++, Ruby, and many many more languages. I had the most fun with people’s solutions that didn’t even use code at all, but instead used pen and paper and manual logic to solve the problem. In this process, I started to realize how lucky I was to have Ruby for some of the more Object Oriented problems (everything in Ruby is an object, EVERYTHING!) and how sad I felt on the Math problems or things like bitwise operators where other languages naturally excel. By about the 10th day I could really tell if a problem could be easily solved in Ruby right away and just see the algorithm in my head if that were the case.

3. Classes, Hashes, Arrays, oh my!

I learned a lot about the various advantages and disadvantages of data structures doing these puzzles. I generally am inclined towards using arrays and hashes, but there were many times I had to scrap my algorithm half-way through realizing that I should create my own class instead. Classes are great ways to organize related data and reuse that information later. My first reaction as a new programmer is always to go for a simple way of storing the data like an array. Working through more complex puzzles made me teach myself to use objects much more often. Instances could sometimes hold information so much more clearly than hashes could. This was the most helpful on the horrible two days at the end of the puzzles where you had to basically build an RPG in order to calculate minimums. I also quickly began to adapt using hashes much more often than arrays. The information in a hash can be unordered and pulled out without an index, but with a reasonable call like a name or identifier, which is super helpful when you have a lot of information and don’t want to remember the order. I kicked myself many times for using arrays early on and then having no idea where my data was by the end of the code. I also internalized a lot about classes and object creation in the longer puzzles.

4. Countless Amazing Ruby Things

The biggest thing I learned during the last two weeks has been all of the amazing Ruby modules, methods, gems, etc. that make doing hard stuff easy. The three biggest modules I learned advanced things about while solving the puzzles were Array, Enumerable, and Regexp. I probably know or have seen every Ruby enumerable at this point. Here are my new favorite Ruby things in no particular order:

  1. #each_cons(n): gives you arrays of n amount in consecutive order so if you called it on [1, 2, 3, 4] and wanted arrays of 2 it would give you back [1, 2], [2, 3], [3, 4]. Isn’t that grand? Great for combinations of linear items.
  2. #combination(n) and #permutation(n): Give an array and the number of elements in each array and get all combinations or permutations of that array. The difference between these two methods was hard to get used to. Basically, if order matters you want a combination and if it doesn’t, go for permutation.
  3. Class: Set:  I used sets a lot instead of array#uniq in order to push only uniq items into a data structure.
  4. Module: Benchmark: Provides methods to measure and report time used to execute the code. When I wasn’t sure if I was just being inefficient or stuck in an infinite loop, I’d use Benchmark.
  5. #each_with_index: Oh, God. What would I do without #each_with_index? This method allows you to do what each does but also keep track of the index you are at in the array.
  6. Class: Digest.hexdigest: Returns the hex-encoded hash value of a given string, helpful for the cyber security questions.
  7. #zip: takes one element from an array and merge the corresponding elements from each array, zipping them together.
  8. Rubular: a website that allows you to play around with Ruby regular expressions.
  9. Handling of bitwise operators (binary numerals at the bit level) showcased well in this article.
  10. #sub, #match, #gsub, #inspect, #take and #name_captures: all ways to handle regular expressions and find string or digit matches inside a particular string. #name_captures even returns a hash! Figuring out how to use all these correctly was a major hurdle and felt great to overcome.

There are many more awesome Ruby things I learned in this process. I also enjoyed comparing Ruby solutions with other languages. I would love to return to these one day and solve them in another language (or two!).

5. Scalability a.k.a. “THERE’S A PART TWO?!”

A great thing about AoC is that every puzzle had a second part. That second part was either easy or hard to solve, usually based on how you set up the first part. With that in mind, it was always helpful to not be hack-y in your solution to the first part. This caused me to spend more time thinking through what the puzzle was asking than brute force hacking.

6. ❤ pry & irb ❤

This post is dedicated to irb and pry. I love you. And you are my best friends in Ruby. Thank you. You will find commented out (and a few stray not-commented-out) binding.pry’s in all of my code. Debugging was key to finishing these puzzles.

App Academy Prep Work!

So I am not sure that I’ll apply to App Academy, but I have a friend who is now a developer who attended their camp and is very excited about the possibility that I will also attend. So I thought I’d take a look. To be honest, I’ve been freaking out a little bit over the last day about it. It’s a pretty intimidating bootcamp. I’m absolutely up for the work and I honestly think I’d be a good fit. I have just been realizing something over the last week about myself: I like to be certain I know something before I’m tested. I once had a friend tell me the the best teachers (and thus the best communicators) are the ones that can struggle the most effectively. I love this sentiment because it’s absolutely my learning style. I like to struggle a lot before I’m teaching or communicating with others about those ideas. This is probably why I enjoy coding so much. It’s a constant struggle (i.e. you never stop learning, so cool!)

Anyway, I’ve decided to complete the App Academy prepwork and test myself on it. This may not lead to me actually applying to App Academy but will definitely lead to me being a better programmer. And it will give me the opportunity actually finish and work through an ENTIRE tutorial on Ruby for the first time (resource overloadddddddd). I will be updating this blog with my progress for the time being but in the meantime here’s the prep work:

I. Before Coding Challenge 1

II. Before Coding Challenge 2

III. Extra Optional (I’ve heard are helpful but not possible to get all the way through)

Phew, think that’s enough prep work? Well, I’m getting started today with the “Intro to Programming” and hoping to finish RubyMonk this week. I’m keeping this all organized on this site and *gasp* on paper! I’m excited to finally get a little organized and actually finish a tutorial. To be honest, I read all of Chris Pine’s book and tried the exercises every chapter but found that the way I approached the exercises I was constantly using clunky or non-descript variable names and I often leaned on the solutions. Now I want to commit myself to some memorization and muscle-memory building techniques so that the syntax and logic becomes more intuitive for me. Here goes & stayed tuned!

Resource Round-up 6/23

Here’s a list of current resources I’m using in my coding journey.

IRL

Most importantly,

Other Newbie Resources

More Ruby Specific