What Am I Even Doing, Anyways? Outreachy Post #3

(Or, in which Maria starts an internship with zero understanding of what it is she’s supposed to be doing.)

I am going to try to keep this post short, which regrettably means my .gif game will not be showing up–the truth is that I’m somehow two weeks behind with these blog entries, so in an effort to catch up, I’m going to try to stick to the main course.

This week’s blog post explaining your project to a newcomer to your community. I think it’s going to be a relatively easy post, because although I read all the materials going into the internship, it wasn’t until we had our first sync over voice chat that I actually understood what the project even was.

(Yes, I’m laughing at myself too, right now.) I thought the project was to add some features to Tor Project’s GitLab Lobby–a web portal through which people who are interesting in collaborating with Tor can request accounts to access Tor’s GitLab, so that they can then make contributions.

In the current setup, people go to https://gitlab.onionize.space/, where they can input an email address and a password requesting access to GitLab, and then a human moderator approves or rejects the request. The moderation is necessary because Tor Project, being focused on web privacy and security and crypto, is constantly under attack by budding hackers and trolls and anybody else that wants to throw a wrench in the works. Four seconds after the Lobby went up and was available to the public, people were trying to take it down.

However, I discovered during my first sync meeting that my project was actually to build an entirely new portal–because the people who keep track of numbers at Tor had discovered that a large percentage of people that request accounts on GitLab Lobby never come back to make that contribution once the request is approved by a moderator. As a result, Tor was probably losing potential bug reports–because a lot of times, when somebody decides it’s time to help out, there’s a very narrow window where you can catch them in a good, helpful mood and get that feedback/note/comment/issue/pull request from them.

Additionally, a lot of people that actually use Tor and would be great bug reporters are super privacy minded (since that is, in fact, the entire point of the Tor browser–to make it hard for companies and entities to track you.) As a result, they’re not big fans of giving out emails and signing up for accounts on a website.

So, at the end of the first sync meeting, I discovered my task was a little more something like this:

Design and build a web portal that interacts with Tor Project’s GitLab account.

Users should 1.) be assigned identifiers that 2.) do not require any kind of sign up via personal details but 3.) can be saved/booked-marked for later in a way that 4.) is instant but 5.) doesn’t create a database entry unless the user has taken an action (e.g., created a note, created an issue.)

Through the web portal, users should be able to 1.) create and update notes and issues that 2.) they can bookmark and look at later, but that 3.) don’t interact with the GitLab API until they’re approved by a moderator.

Additionally, the portal should be able to be accessed with Tor Browser as an onion site with relatively high security settings – which means a minimum of JavaScript, etc.

Oh, I thought. Is that all?

Just kidding. I just about peed my pants.

I mean, I had so many questions. I barely understood how API’s worked, having written two baby apps that did basic API calls and parsed data out of the dictionary. I really didn’t have a solid understanding of how Django handled users and groups, etc., because most of my projects to this point had only one person interacting with them on anything more than a view-only level (me. I’m the person.)

And while I felt pretty strong in my understanding of basic object-oriented programming and CRUD, the focus on security and the desire to keep the amount of hits to the database low made things really interesting for me–for example, if someone wants to put a note on an issue that exists in GitLab but not in the project’s database–should the project create a Note, foreign-keyed to a new issue? Should I have two kinds of notes–notes in the database, and notes in the API?

And the craziest part of all of this was that my mentor, having seen me code some, had complete faith in my ability to accomplish these tasks and was letting me make decisions about how to go about accomplishing them!

And the even crazier part is … he was right. We just had a sync last Tuesday, in which he advised me we were 1.) ahead of schedule and 2.) ready to move this project to a location where testers could start trying to break it–that essentially, we had our minimum viable project.

And … for the most part, it works. When a new user who is not “logged-in” (because it’s not a true login!) visits the site, they can generate a user identifier – which is a six word code-phrase that gets randomly pulled from an approved word list. Once they click “log in”, this identifier is then passed as an argument in each URL throughout the system. They can search approved projects on GitLab, make notes and issues, and leave–all without giving any of their own personal data to the system.

The system itself makes API calls to GitLab using Python GitLab once an issue or note is approved by a moderator–who are the only true “users” of the site, from a Django perspective.

I can’t–like really, really, really cannot–believe how much I’ve learned over the course of the last six weeks. Just a few days ago, I decided it was time to create the “moderator note update” view–so that moderators could make changes to notes before approving them. I think something like that would’ve taken me a few days when I started this project–looking up views and classes and objects and filter tags and trying to make tests and yadda, yadda, yadda ….

It took me an hour. An hour to create the URL path, the view, the template, attach the decorators that would check for staff and permissions, add the custom tags and filters so that everything would render the way I wanted, and write the tests. And somewhere in the middle of writing the last test, I just about had a heart attack, because, surprise, I knew what I was doing.

I, Maria Violante, know what I am doing.

At least twenty percent of the time.

Everybody Struggles: Outreachy Post #2

(Or, In Which Maria Reveals She Has No Sense Of Time)

Upon receiving today’s Outreachy email, in which participants were advised that for their week 3 blog post, they’d be writing on the topic of “everybody struggles,” my first thought was: why are they sending these out so early?

Mr. Bean checking a calendar and explaining something to a small stuffed animal--to be honest, I don't totally understand this image myself.
Me Engaged in Debugging My Calendar

And then I actually, ya know, checked the date, and I realized, holy cow, it’s already been two weeks! Two weeks … out of … twelve?

This internship is already a sixth over?

a wrestler looking confused as the camera pans in on him ... i want to say it's john cena, but I don't actually know wrestlers.
Yeah, I’m bringing this one back.

I’ll be honest. I wasn’t entirely certain how to feel in that moment–but then I had to laugh, because today was the first day in the entire two weeks where I’d felt truly frustrated. At one point, I ran python manage.py runserver and thought, woo hoo! It’s there, I added in this new feature and fixed that bug!–and then clicked on a link, only to discover I’d somehow invented an entirely new problem, one that was making things happen I could not have implemented if I’d wanted to. I literally yelled, “What? Why?!” at my computer, before leaving to pace circles around my house.

It had taken me 2+ hours to get to that point. And when I decided to go back to the last commit and try to do the thing I wanted again, I typed everything in once–and everything was suddenly working perfectly and testing good. It took literally two minutes. (Typo? Forgot to save? Whim of the Django gods? WSL2 not playing nicely with VSCode? Who knows?)

The picture of possibly John Cena looking confused yet again.
Honestly, given the topic, the entire post is just going to be this one picture. You’ve been warned.

So of course the very next thing to land in my inbox was a scheduled blog topic called, “Everybody Struggles.”

Although we were given some prompts for this particular post, I’m going to expand out from them a bit, because this experience (and the last two days in particular) have really taught me some things that I’ve actually been wanting to write about, and I think they relate pretty well.

Things I have Messed Up Opportunities For Growth:

TLDR: Just because you can do it, doesn’t mean you should (or, Django is smarter than you, and that’s okay.)

One of the hardest things for me to reckon with as a new programmer is that I’m a perfectionist. This sounds good, but can be really annoying: when my partner and I were trying to build a deck and a nail went in crooked, I spent ten minutes googling “proper hammer techniques” and learning said techniques before coming back with a primer on correct hammering. (Did the nails go in straight? Yes. Has my partner forgiven me? This is less conclusive.)

If I’m doing something new–from cooking a dish to driving to a new location to making a major purchase–I want to know the most-efficient/most-common/best-practice way to do things. It makes me feel safe and gives me a warm, fuzzy glow.

And if you’re a software developer or programmer or, honestly, have ever used a computer, or are over the age of … ten? … you’re laughing your buns off right now, because a lot of times, there isn’t a right way. There’s a right way for right now, which comes down to things like project goals and your abilities as a programmer and team composition and project architecture and if making a change is going to break everything.

And this is especially something to keep in mind when you’re early in your learning journey. So, for example, I had just started learning about and implementing class-based-views (CBV’s) in Django right before my internship started, mostly so that I could bake out my portfolio using Django-Bakery as static flat files (and whoa, this package works amazingly well, and I am in love.) And, if you’ve ever used CBV’s versus function-based-views (FBV’s) in Django, you know that they’re … hella-cool. What’s this, two lines of code, and you’re gonna just render my site/posts/blogs/database-objects-as-pages/whatever? Neat. How elegant! How pretty! OOP for the win!

When I started getting into the nitty gritty of my internship project (an anonymous GitLab ticket interface for Tor), of course I wanted to use CBV’s. They’re better, right? And I know how to use them, right?

Except that one major difference between FBV’s and CBV’s is that in a CBV, the “under-the-hood” logic is all happening off-screen–vs a function-based view, where you’re defining your functions and spelling everything out explicitly. There are also places where you’re just better off with a FBV–like when you’re developing a new project and not sure what direction this particular view is going to go in, and you’re constantly implementing and pulling out new features–or when the page you’re creating requires some special logic that doesn’t natively come pre-packaged in a CBV, and you wind up having to redefine a bunch of kwargs and how the view gets context and now you’re kind of panicking because you did all these things and something way, way later in the view needs to be changed to make this new User Identifier validation method thing work but you don’t understand how all these pieces interact and–

It's still just the same gif of maybe-John Cena looking confused.
What I really need is this picture, but with his eyes filled with tears.

And if I don’t know what’s really happening in my code, it also makes it hard to ask for help, because the first thing any smart mentor/friend/stack-oveflow/random-stranger-in-a-bar is going to do is try to help you rubber-duck the issue, which doesn’t work if you don’t even know what’s happening. (Just kidding on the bar–there’s a pandemic, people. I haven’t left the house in months.)

Which is how I wound up having an epiphany: hey, Maria, maybe you should just … do this as a function-based view right now? You can always make it a CBV later if you want.

So, that’s what I did. I redefined the view, writing out my own functions–and then I wrote the tests, which I now understood, because I now actually knew what the functions were doing–and the tests helped me understand the functions even better. And when I hit a snag that I just could not figure out myself and I contacted my mentor, we solved it quickly and easily, because I knew what my code was actually doing and when it was doing those things.

(And then I promptly broke everything four minutes later again.)

a gif of Debra Morgan from Dexter, crying and having a breakdown, while the text beneath reads, "I'm broken."
me/Django, every time we $ python manage.py runserver

The point is … wait … where was I?–oh yeah–when I was googling frantically for an embarrassing amount of time, I learned a number of lessons.

The first is that Django is a mature framework–as in, it’s been around since 2012–and in that time, it’s grown and expanded to the point where there are a lot of ways to accomplish any given goal. It’s almost impossible to know them all. I know people who have been working with Django full-time for years that tell me all the time they figured out a new feature/package/problem-solution, so it’s a massive amount of ego on my part to think that it was even possible to just “do things the best way.”

The second is that most of the time, the way that works and that you also understand is the best way. You know it, I know it, we all scream for Talenti Mango Sorbetto–but it’s still hard to put into practice sometimes, because, again, it involves checking your ego at the door.

A gif of a painted illustration of an empty Talenti Alphonso Mango Sorbetto container, surrounded by a field of mangoes. One by one, the mangoes flow into the container, before spilling out again.
The desert that convinced me I really could be vegan for life

But part of being a good programmer is saying, hey, what are my capabilities right now? What is something I should leave as a stretch goal for the moment? When should I just be trying to solve this problem, versus refactoring? (In other words, don’t get ahead of yourself, Maria.)

The third, final, and most important (probably–I mean, these are all real valuable lessons here) is that I need to stop being so reluctant to ask for help. If I had even tried to reach out somewhere before the two-hour mark, I would’ve immediately realized that problem numero uno is that I didn’t know what my code was doing, but I didn’t ask my mentor, because I was embarrassed and there is always a little voice squawking in the back of my head with some version of you’re not a real developer–you tricked them into picking you for this internship–if they knew how dumb you were they would be horrified.

(None of this is my mentor’s fault, by the way. Alexander Færøy is literally one of the nicest people I have ever talked to.)

Wait, I lied:

I know I said that last lesson was the final one, but there’s one more lesson in there, one that only occurred to me during the writing of this post:

I need to push back against the imposter-syndrome voice more often. Especially in light of its probable origins.

I’m sure it’s partially due to things better discussed with a therapist–but given that almost daily, we have to read about some tech-bro that hires women based on their hotness rating–or research from Github that shows that women have their PR contributions accepted more often than men, but only when they’re not identifiable as women, I’m sure a significant chunk of it is internalized bias about being a woman in tech in the first place.

Although I’m fairly new to Python/Django and programming in general, I’ve always hovered somewhere STEM adjacent. I got into a magnet school for math and science when I young–only to drop out, despite doing pretty well academically, because I didn’t feel like I belonged. I was constantly being told how unsexy geeky women were (I am oldish; I hear this is changing) while simultaneously hearing about everybody’s family yachts and Aspen trips and Ivy League aspirations. I didn’t feel like something “hard” could be right for me, despite the fact that I was a huge biology nerd that was also already building computers and making websites in freaking notepad.

(Side note: My career in healthcare? Yeah, no better there. Despite the fact that over 90 percent of the professionals in my graduate-level specialty are women, I found that sometimes, having a male receptionist repeat what I was saying to patients/other providers magically made them agree with my original points.)

Truth be told, I still wouldn’t be working with Python or Django if I didn’t have a friend that is actually a DjangoGirls organizer who has been encouraging me down this road from day one. And when I started seriously considering that hey, this might be a good fit for me, I looked at other languages and frameworks, but decided that I wanted to stick with Python/Django because the community is just so freaking positive and helpful and inclusive. It just felt safer than some of the other communities, because there were organizations like DjangoGirls.

Whoa – You actually made it this far? Okay, a final gift!

If you, perhaps, are also a perfectionist that needs to know everything and happens to be moving into a better understanding of CBV’s, you, too, will squeal with joy at Classy-Class-Based-Views. Although the Django docs are amazing and complete and beautiful, tracking all the implicit methods in each of the generic CBV’s and its ancestors, etc., can be a real chore. This site lays it all out, like one of those giant anatomy wall-charts of every muscle in the arm. I seriously love it, and if you’re like me, you probably will, too.

Core Values: Outreachy Blog Post #1

One of the neat things about the Outreachy Project is that they encourage the interns to make blog posts about selected topics on a schedule, which of course increases the sense of community!

The first post is an introductory one, which includes an about me, some core values, and motivation for applying–so that’s what you’ll be getting here today!

Who Am I?

My name is Maria Violante. I’m from the USA (southwest Michigan in the house!) and am a career-changer, having a previous background in healthcare (specifically outpatient rehabilitation) and also, briefly, property management.

I’m fairly new to Python and Django, although I’ve got previous experience in making websites (primarily WordPress websites for authors, although I’ve been hacking away at it in some form or another since CSS was new–whatup, 1994–and I distinctly remember writing html in notepad to put on … angelfire? … so that I could have a cool landing page that auto-played a MIDI of “The House of the Rising Sun.”)

I love: puzzle games, reading (especially literary-leaning speculative/SFFH), mysteries in almost any format, craft beer, and I’m a new vegan, which means I’m learning how to cook all over again. (I also have a dog that looks almost exactly like of one of the cute pre-transformation gremlins from the Gremlins movie and a potato had a baby.)

I dislike: really noisy environments with lots of people (which is probably one reason I live in an area that was designated by the USDA as a rural development zone), lax environmental and labor regulations, and corporate invasion of privacy.

Core Values

1.) Open, mutually respectful communication:

I honestly don’t understand why we can’t just treat everybody like a person worthy of respect and have give-and-take in all of our communication endeavors. I firmly believe that no matter what your level of skill or status relative to another human being, there is probably something you could learn from them, so it makes no sense to treat communication with your peers as zero-sum interactions.

2.) Curiosity:

Human beings are hard-wired for curiosity. We find investigation into things we don’t know or understand to be intrinsically pleasing, and when we embrace curiosity as a world-view, we open ourselves up to new aspects of the human experience, including a greater understanding of the world we live in, which is pretty affirming!

3.) Diversity, particularly with an eye toward collaboration:

I also firmly believe that most of our institutions (at least in the US) have retained a level of structural inequality from a history of colonialism, sexism, and otherwise taking advantage of large swathes of the population for primarily financial gain, which has resulted in sectors that are much less diverse than the population as a whole. Although I feel that this is personally morally/ethically wrong, it’s also bad for these industries; collaboration between a diverse group of individuals leads to stronger, more creative problem solving and healthier workplace cultures.

What Motivated You to Apply to Outreachy?

Besides the fact that it’s an amazing organization, with a great mission statement (Increasing diversity in tech! Connecting interns with mentors! Creating stronger open-source communities!), I’m really motivated to grow as a programmer. Although I’ve really enjoyed making my personal projects and solving problems in my own way, I really feel like my next step to becoming a better programmer is working on team projects– which includes hands-on practice with the tools of software collaboration, reading and exchanging tickets and documentation, getting a better grasp on some of the auxiliary tools used in a joint workflow (I have learned a bunch of new ones just today, including kanban boards!) and understanding better the life-cycle of bringing a software project to fruition. (December 1st, 2020, the day Maria learned the acronym MVP for minimum viable product.)

Additionally, I was really excited about this specific project in particular–both because of the organization (internet privacy is one of the battlegrounds that more people need to take a stance on; how’s that saying go? If the app is free, you’re the product?) and the fact that the anonymous ticket project being submitted for the Outreachy internship seemed at just the right level for me–a challenge, but one that is building on the knowledge of I’ve already acquired (she said hopefully!)

Wish me luck! I’ll be posting here from time to time with further Outreachy blog updates!

In Which I Find Out I Will Be an Outreachy Intern

At heart, I’m probably what you’d call a pessimist. I’m sure some of that comes from my mom, an immigrant from a country that has a long history of being torn apart by colonialism and civil war. That kind of circumstance often creates a kind of level-headedness about aspirations of success.

Image from Kim's Convenience, in which Mr. Kim says, "You work hard, I work hard. We all work hard by taking out the garbage."

While I definitely would put forth that I work hard toward achieving my goals, and I certainly have dreams, I generally don’t allow myself to get caught up in big hopes as I go about my day to day. I also don’t linger on things–as soon as one thing is done, I think about the next, and the next, and the next. I always have 3-5 projects in various states of completion up in the air at all times that I’m actively working on. If something doesn’t pan out in one arena, I do my best to forget it and move on.

And while there are things about this approach that probably need changing–I really have to learn to enjoy my successes more, for one, and give myself more credit–one of the most comical effects is that as I generally don’t assume I’ll be successful in an endeavor, I’m often really surprised when I am–and often not even around to find out I actually managed to do something!

Case in point:

Earlier this year, I found out about the Outreachy internship–a really awesome non-profit project designed to increase diversity in tech by connecting potential interns with mentors from (primarily open source) software communities. In addition to being a paid opportunity, the internship is remote, which is amazing for people like me that live in communities that don’t have a strong tech presence. (We have … uh … *peeks out window*)

Image of a cow

As a mostly front-end website creator that has been moving into Python programming and Django, this looked like a really cool opportunity–and I had the benefit of a friend in tech, who not only believe in me strongly, but would start all of our conversations/texts/emails with some variant of So when you apply for this internship that I’m not going to let you talk yourself out of …..

(Hi, Rachell!)

So I did it! I applied for the project, actually learned to use the command line and git (yes, I was previously using VSCode in Windows; I can feel your judgmental stares), and made my very first open-source contribution, to the Tor Project Gitlab Lobby. Along the way, I got to meet some cool people, chat with mentors, and make my very FIRST APPROVED PULL REQUEST.

And I’ll be honest–I needed that.

For me, like it was for many, 2020 was a rough year. I used to work in healthcare, until I got sick with presumptive COVID in March. This was early enough that (at least in my area) testing was almost impossible if you didn’t have contact with a known case or a recent travel history. It took me months to recover–during which time I was unable to work in my field or do pretty much anything. I was laid up and needed something to do (and also to make money), so I went back to making websites (mostly WordPress.) And my super awesome tech friend was like, yeah, those are nice, but you should learn to program–which she had been telling me for, um, four years, now?

And one day, I opened my mail to find a package from her, with a little yellow book called Crash Course Python, and I figured, hey, why not, and cracked it open–

A picture of a textbook called "Crash Course Python", with a picture of a snake riding a plane engine on the cover.
Exhibit A

And just like that, I was hooked. I’d had this idea in my head that programming was math–and while sure, there’s math, the key factor I was missing was the second part of the phrase: programming language.

And boy, do I love me some languages. Learning foreign languages was my hobby for most of my late teens and twenties–including languages without a base in Latin. I love that lightbulb moment of breaking down something that feels familiar into a new classification system and figuring out how to navigate or communicate in it.

You know what my other favorite thing is? Solving puzzles.

(Yeah, I should have put this together earlier. I’m dumb like that sometimes.)

I spent the next few months programming obsessively. My partner would come home from work to find me hunched in front of the computer, only to discover that I had not eaten or showered yet. I stayed up really late most nights trying to get just one more thing to work. I finished the book and found Dr. Chuck’s python course on Coursera and did that entire thing, started the Django for everyone course, and then just as I was thinking, man, where do I go from here, Outreachy showed up in my newsfeed and I had a new thing to obssess about.

So you can understand, now, how it felt getting my first pull request approved to the Gitlab Lobby for Tor Project. It felt like redemption. It felt like, wow, maybe I can do this.

A gif of a guy standing with his

Once the contribution period closed and all the applications were in, I promptly assumed I would not be chosen as an intern and forgot ALL about it. (Okay, I didn’t actually forget. I shoved this internship into the quiet place in my head where all my secret dreams are.) But I felt way smarter than I had before, and I spent some time learning some new skills, including playing with class-based views in Django so that I could roll out my website portfolio in Django Bakery (static site generation for the WIN), as well as working on a text-based adventure game I’m putting together that doesn’t rely on maps or cardinal directions, because I’m terrible at that. I also put in for other jobs, and lined up some more contracting work.

When the announcement came in for the Outreachy interns, get this: I didn’t even check it. I was so sure that I had not, in fact, gotten in, that I swiped away the notification and went back to typing … something.

A few hours later, I got a weird feeling in the back of my head, the hey, you forgot something important kind of feeling, so I went back into my email, and there was the Outreachy notification again, and I thought, hey, why not? At least, there will be some cool people to follow in Twitter, and–

A gif of a wrestler looking extremely stunned
(Live footage of me checking that email.)

Whaaaaaaaaaaaat?!?!?! Tor Project wants to accept me as an intern???

(My very first thought was, Did they make a mistake sending out these emails?)

So then I hopped on IRC, and yep, one of the project mentors had messaged me almost an entire day earlier, and I had just been going about my business, no idea that I’d already been accepted.

Image of handsome British actor I've forgotten the name of (maybe Hugh Grant?) thunking his head into the desk.

SO YES! I, MARIA VIOLANTE, will be an Outreachy Intern from December to March, working with the Tor Project on an anonymous ticket handling project.