A Brief Exchange at Abstractions, or, a Reminder of How Far Our Culture Has Yet To Go

Published by:

“So you want to be a developer?” I was asked on my second day of Abstractions, sitting in the front row waiting on a talk. It took me aback, at first, because I was surrounded by developers and thought I very much looked the part–jeans, t-shirt, backpack, pink hair. I look younger than I am, or so I’m always told, but certainly old enough to be out of college. The only difference between me and the person next to me, asking this question, is that genetics have left me very firmly feminine-coded.

Abstractions was my first multi-day conference as a developer–as someone working as a developer, being paid to write code that is consumed by thousands, if not millions, of people. “I am a developer,” I told that person, who I don’t think I’d be wrong to assume was a man.

But at a conference with a high (for tech) amount of women and with many women speaking, it was a reminder of how insulated one can get by the appearance of inclusion. This particular talk was code-heavy, focused on developers, with slides in simple Ruby that afterwards many people around me complained about not being able to understand.

I didn’t ask the man what he thought I was (a designer trying to bridge the gap? a student there to network?), in retrospect I wish I had. Or perhaps asked what other speakers he was going to see–if he had sat through Sandi Metz thinking she was less of a programmer than the men who would appear on that stage.

But, as my first multi-day conference as a working developer, at a conference that did so many things right for inclusion, it was a reminder that developer culture still has a long way to go.

Mailing Lists for (Women) (in Tech) (in the DMV)

Published by:

As someone that grew up when a major form of communication online was mailing lists, such as egroups/onelist, I’ve always been partial to them. So, while job searching or simply trying to keep up with my interests, I tend to seek them out. I’ve found a few lists that I thought I’d put down in one place for anyone that might be looking. Some of these are specific to women in tech or women in the DMV.

Systers 

  • Reach: Women in Tech
  • Location: International
  • About: The oldest women in STEM mailing list, created in part by Anita Borg.
  • Topics: Everything. From tech and women in tech to job hunting and college roommate searches to people complaining about their jobs to people just talking about where they live. I suggest getting the digest format or setting up a filter/rule.

DCWW

  • Reach: Women in Tech
  • Location: DC Metro area
  • About: A professional organization that runs events (there’s an upcoming job fair) and also happens to have this list.
  • Topics: Another ‘women in tech and everything else’ sort of list. However, this one is mostly focused on the DMV and has the added benefit of people adding tags to their subject lines so it’s easy to see when a post might interest you or not.

Hear Me Code

  • Reach: Women in Tech
  • Location: Washington, DC
  • About: An educational organization which offers free lessons and other resources.
  • Topics: Emails are often announcements, events, and tech topics. Includes some job postings and tends to stay relatively on topic. It’s run on Google Groups, which makes it easy to navigate.

WINlist

  • Reach: Women (pro-choice)
  • Location: DC Metro Area
  • About: Professional organization dedicated to furthering women and women’s interests. This is a membership-only organization and has an annual fee, however it also has more benefits and bigger events than most of the others. Very good for anyone who wants to work in politics/government.
  • Topics: Various, a lot of political topics, lots of events, job posts/searches, volunteer opportunities. Subject lines are labelled and unlike most of the other groups, people almost always reply to the OP instead of the whole list. It’s also run on Google Groups so it’s easy to navigate.

Technically Speaking

  • Reach: Anyone who wants to speak at conferences
  • Location: International
  • About: This is a newsletter, it’s focused on giving conference talks and the like. Since that’s something it would be great if more women did, I think it fits to add it here.

DC Inno

  • Reach: People in Tech
  • Location: DC Metro Area
  • About: Another newsletter (or, well, a bunch of them) that is about tech in DC. Generally focused on start ups and news, but it includes events, job listings, and the like. Almost always has mentions whenever DMV women in tech are in the news.

Technical.ly DC

  • Reach: People in Tech
  • Location: DC Metro Area
  • About: Another tech newsletter with a DC focus, the website includes a job board and other resources. As with most DC tech newsletters, is fairly focused on startups and the like, but still pretty interesting.

If anyone else has any favorite mailing lists/newsletters for Women in Tech (in the DMV) I’d love to hear about them. I’m sure I’m missing a few here.

Following, Friending, and Lending: Self-Referential Associations with Rails

Published by:

Self-Referential Associations happen when you connect a table back into itself in Active Record. This is commonly found in a Following function, where one User follows another. As a new Rails developer, the first time I tried these was somewhat daunting, but I managed to pull off both Following and Lending in my app. I used a helpful Rails Cast and various Google searches to figure this out.

This post assumes that you have already setup authentication in your app and have some way of referencing the logged in user (referred to as “current_user”). I have my Solution and a Starter in this github repo, both have authentication that only requires the username to login.

Start by thinking about what your associations–what are you connecting? For basic Following (in the manner of Twitter’s following feature), you are just connecting two users. Therefore, you need a join table with has_many through in your model.

Setup the join table:

Here you reference one user, but then need a way to reference a second user without interference. In this case, I use “followed” to refer to the other user–they’re the ones being followed.

t.integer :user_id
t.integer :followed_id

You do not need to touch the Users table, since we’re using a join table. Then migrate this new table to add it to your database.

Now that you have the table, you should set up the route:

resources :follows

That’s it. You can nest it with users if you’d like, and then change the rest of the code to suit.

Next setup the Follow model. This is where we show that the “followed” is actually a User:

belongs_to :user
belongs_to :followed, :class_name => “User”

In the User model, we also need to setup associations. Since we have two users in everything we do, we need two sets of references here. The user has many follows (for the follow table) and has many followed through follows (they can follow many users). But they also can be followed. Here I used “inverse” to show the second relationship, which seemed to be the way others online were solving this issue.

has_many :follows
has_many :followed, :through => :follows
has_many :inverse_follows, :class_name => “Follow”, :foreign_key => “followed_id”
has_many :followers, :through => :inverse_follows, :source => :user

So: A user has many entries in the follows table, which connect them to the people they followed. A user also has many entries in the follows table of people who are their followers.

This is a good time to setup a Follows controller, as well, with an empty class.

Since this is a self-referential association with Users, I put the actual method for following in the Users model.

def follow(other_user)
if self.followed.include?(other_user)
return false
else
self.follows.create(:followed_id => other_user.id)
return true
end
end

This is a method called “follow” which takes in other_user (a variable I’ll be defining in the controller) and after checking to make sure they’re not already following that person, I create an entry in the follows table referencing the user the current user wants to follow.

Now I go back to the Follows controller and set up the create method. We don’t need “new” because we’re not using any views.

def create
@user = User.find(params[:followed_id])
if current_user.follow(@user)
flash[:notice] = “Followed user.”
redirect_to current_user
else
flash[:error] = “Unable to follow user.”
redirect_to current_user
end
end

This takes the params and sends it to the follow method (@user becomes other_user). If the follow method works (if the user isn’t already following them), they are given an announcement saying they followed them and then redirected to their own page. If it doesn’t work, they are given an error and redirected.

Since people should be able to unfollow, as well, you set up a destroy:

def destroy
@follow = current_user.follows.find(params[:id])
@follow.destroy
flash[:notice] = “Stopped following user.”
redirect_to current_user
end

Basically, you’re just destroying the entry in the follows table associated with that id.

Now for another difficult part, the views. This is where the links will go that allow users to follow each other. This can be hard to visualize how it’s supposed to happen, if you’re not using a specific follow view.

In the Users index, I put a list of the Users:

<h1>Users:</h1>
<% for user in @users %>
<p>
<strong><%= link_to user.username, user_path(user) %> </strong>
<small><%= link_to “Follow”, follows_path(:followed_id => user), :method => :post %></small>
</p>
<% end %>

In the Users show page, I put a list of each user’s followeds and followers.

<h2>User: <%= @user.username %></h2>
<h3>Followers:</h3>
<ul>
<% for user in @user.followers %>
<li><%=h user.username %></li>
<% end %>
</ul>
<h3>Following:</h3>
<ul>
<% for follow in @user.follows %>
<li>
<p><%=h follow.followed.username %>(<%= link_to “remove”, follow, :method => :delete %>)</p>
</li>
<% end %>
</ul>

Other things you can do: Create friendships, where relationships have to be mutual to show up, or create lending features, where you connect another model and have one user lend something they own to another. For an example, check out what I did with Loans in this project.

I’m happy to answer questions, too.

Personal Projects and Four Weeks To Go

Published by:

What I’ve been working on in class: learning Javascript, fiddling with JQuery, working with AJAX and Rails with Javascript. The first week with just Javascript and JQuery was a little too easy, this week has been the opposite.

What I’ve been doing outside of class: Working with SparkFun’s Starter Kit to teach myself how to use Arduino and send basic code to the board, poking at Johnny 5, and following Unity tutorials for 2D game making. While I actually think I prefer the backend stuff, I’m incredibly fascinated by Nodebots and seeing the ways that these .

Next week in class is our third project. This apparently is the open ended one, where they tell us to do whatever we want, as long as it involves Rails and AJAX. I’ve had an idea for a personal comic book library app for awhile now (I might have already started user stories *cough*), and might attempt that. For the final project, if we do get to choose to use other languages (which people have done in the past), I know I went to attempt MEAN Stack. Well, unless I really take off with the Nodebots and can do something with them.

Things I need to follow up on: If there is a job that mostly involves User Stories (laugh, but I’m apparently “textbook” at them and I kinda enjoy it now that I’ve gotten the hang of them), what would be the best to use for my game idea (mysterious sounding, but I’ve been talking about it off-line with tons of people, if I can actually manage it I think it will be great fun), and finally finish putting together my tech resume.

I can’t believe this is the end of Week 8. This has gone so quickly. But when I look back at my first-week coding, I think it’s obvious I’ve learned a ton.

UX and Web Design

Published by:

This week, we’re working on our second project. Not only are we teamed up with people from the other Web Development Immersive (WDI) class, but all the teams have someone from the User Experience Design Immersive, too. Our first day was almost entirely planning and UX, which was an interesting experience. On Saturday, I took an 8 hour intro to UX class, which had prepared me, at least. I knew what to expect and how one would make wireframes and how to do user research, I knew what basics to expect.

The process is supposed to prepare us for a potential job for a company with UX professionals, though it’s felt somewhat uneven. Most of the UXers aren’t really aware of the technical constraints on projects, and they also don’t know CSS or HTML. Since we don’t have separate front-end and back-end people, our group has separated with two people working on the back-end while I work on the front-end.

I finally have an excuse to use Foundation for something, but working on CSS for days on end can be trying. I miss just fiddling around with Rails and trying new things. I wish this project had been a few weeks later, so we had been learning Javascript and could make these apps even more interactive. And I wish there wasn’t outside-of-our-projects, school-related drama going on at the same time. Emotions are high and it feels like that’s stripped out most of the urgency that we had felt for our first project.

You may have possibly sunk a Battleship at some point

Published by:

Last week, Week 3, was our first project week. I was out sick with a bad cold on Tuesday, when they were assigned, and scrambled on Wednesday to catch up. Out of three projects, I was given Battleship. Or, creating a Ruby program for a command line Battleship game. It was generally accepted to be the hardest of the projects and just seeing the directions were overwhelming at first.

Deciding on what type of grid I would use for the board was my first step. It took way too long, but I felt that I had to have the board setup before I could hope to do anything else, since so much would rely on it. Finally, I decided on a one-dimensional array, which I would print out on the screen for people to view. I think it was the simplest method to use and it made finding the actual hits and misses very easy.

The grid printed out the coordinates, as well, and players could just type in the grid location, like you would say in a real life Battleship game, “A1,” “B2,”.

From there, I had to build up the game itself, using While loops and If/Elsif to go through the motions of every possibility that might come up. I created a game table in ActiveRecord, with ships, players, and turns as subtables. Since ActiveRecord isn’t the biggest fan of arrays, separating turns into their own rows and then turning them back into an array later on seemed like a better choice.

It was a harrowing experience, but after the fact it was a great learning opportunity. The fact there were so many ways to go about making the Battleship game meant that it was next to impossible to fall back on anyone else for help, unlike with many past homework experiences where we were able to work basically in a group. So, while it is very important for coding to have experience working with others, it was good to spread my wings and have to rely basically on myself.

(Coincidentally, on Thursday afternoon our class took a fieldtrip to USAToday and part of the presentation we were given involved slides where the person who created them used Battleship as a metaphor. Since most of us were desperate to get done by Friday morning, we shared a slightly hysterical chuckle.)

Difficulties:

The necessity to use ActiveRecord to save game information–not just players and scores, but the actual ship locations and previous turns–so people could restart them made things unnecessarily difficult in my opinion. While it was necessary for what we were learning and trying to practice at the time, in a real life situation I feel it’s unlikely anyone would want to restart their Battleship game partway through, as opposed to just starting a new game each time.

Things I wish I’d gotten to:

Changing the places on the grid to reflect a hit or miss (I had started, but had to trash that code because I couldn’t get it to work). Making it look nicer (I had tried to design all my own text art, but realized after the fact I should have just used a website). Adding a two player option (again, something I started, but didn’t get to finish). Separating the game out into more methods, so it’s more compartmentalized and would be easier to switch between single player and two player games.

I also was wondering about how much time this would take in a larger app, how many bits I was taking up that might be a constraint with something else.

You can find my most recent work on the game on Github.

 

 

 

Week Two – SQL

Published by:

I’m on the second week of my web development immersive (week 2, day 4). We’ve covered various basics of Ruby and are now on database integration.

Yesterday we worked on SQL, which I actually found enjoyable. It was easy to work out what commands to do and how to move through our homework. I think the difference between the people who had an easy time doing the SQL work and those who struggled was the ability to understand just how much SQL was capable of. Some people in class were setting up entire new tables and performing the necessary actions to solve the homework problems in multiple steps, instead of just one line.

I found SQL such a relief after some of our other work that I feel it was easy to accept that everything we do could be done in one line. I was looking for temporary columns while others were making actual columns and then deleting them after they had finished. For once, I felt ahead of the class, explaining problems to others with confidence. I wish everyday in class could be this easy!

Having such a moment on a Wednesday was good, too, I think, it helped energize me to get over hump day. Hopefully every week from here on out will feature at least one day where I feel on top of things.

The Week Before

Published by:

Next week, on Monday, I’ll be starting a 12 week long Web Development bootcamp. I’m nervous, I’m anxious, I’m wondering how the hell I’ll get through it. But I’m also excited.

My very first exposure to computers was on DOS. I still remember learning a few commands alongside of my mother so I could go into the basic computer games and word processor that I loved. A few years later, AOL made it possible to get internet in our home and I branched out. I had websites at places like Geocities and Angelfire, coded by myself using internet tutorials and from studying the source code of other websites to figure out how to do things. In high school, I took a web design extracurricular, and one on C++.

But my main memory of technology from my teen years was in tenth grade, when I wanted to take the Robotics course my school offered. The guidance counselors had to approve our schedules and mine, an old white man, refused to approve that course. It was a “boy’s class.” I still remember sitting there, so angry but feeling absolutely helpless. He ended up adding me to a cooking class, instead.

Sexism in STEM is still around, but I, personally, am no longer scared of it. And while I didn’t have the chance to learn programming before, at this point, this exact place I’m at, I do have three months to take 450+ hours of class.

And even if I’m still a little burned out from undergrad, grad school, and that semester of law school I tried, I’m still going to do this. I have to.