I’ve been meaning to write this post for over a month, but deferred because I’m busier than I’ve ever been, to the point where my approach is now to just get things off my to do list by any means possible. A few weeks ago, I actually resorted to using a simplified scrum board to track my obligations and priorities; as a result, I’m finally making progress on all those need-to-do-this-sometime-but-nobody’s-paying-me-to-do-it-right-now things that have been clogging up my mind for the last 6+ months.
I wrote my last Outreachy blog post on February 1st, detailing that I was a month away from finishing up my internship. The period between March 1st to around June 1st was kind of a bummer. I put in a lot of applications, generally didn’t hear back, bombed the interviews when I did, did a number of frustrating coding challenges, and anxiously started to wonder if this whole programming thing was, in fact, the expression of some latent mental illness I hadn’t quite put my finger on.
And then my (much wiser) friend mentioned that I’d done pretty well rustling up short-term contract work, and that people, you know, did that full time. Which I think I’d never really considered–I’d been so used to having a job and everything that entailed that the idea of just continuing to drive my own ship the way I’d been already driving it just hadn’t popped into my mind. And I had so many doubts, like: can I develop as a programmer if I don’t have strong mentorship, a good team, one of those in-house development plans?
But I had nothing to lose. So I decided to shift my focus. I reached out via twitter and in my personal network, and within a few weeks, I had not one, but two offers for regular, long-term contract work.
As you can imagine, this was the part where I started sobbing. Although I didn’t strictly move into programming for the money, per se, it definitely pays better than healthcare. I’d gotten sick and then quit my job and my career and taken this huge leap of blind faith, dragging my husband along for a ride–and here it was, the proof that this hadn’t been a mistake all along, that I hadn’t been crazy, that people were actually going to pay me a living wage for doing this.
The decision, as you can imagine, was agonizing. The first offer was at an agency that seemed like it would be amazing to work at, doing a number of sequential django client-facing projects, and it seemed like they really wanted me, to the point where they pivoted mid-process and asked if I wanted to come on as an employee instead. I couldn’t believe it. That said, they also seemed like the kind of place where everybody gives 110% all the time, and to be honest, after reinventing my entire life over the course of the year, I was feeling a bit burnt out. I was ready to roll up my sleeves and get to work, but I was also worried about taking on more than I could handle.
The second offer was at a headless CMS, and the project looked really exciting, and I really liked the idea of staying with a single project long term and kind of getting to know it on a really deep and fundamental level. They actually had me use the product during the coding challenge, and I have to say–it’s really slick! Drop in blog with Django (or any other stack) that allows you to use your own templates, styling, etc., with totally minimal fuss? Um, yeah, I’m into that. They were also offering more flexibility in terms of hours per week, less meetings, etc.
I thought hard about it. I cried a lot. I contacted every programmer I’d ever talked to for advice, sure there was some huge, big red flag I was missing on either side or both that would make this decision easy for me, but there really wasn’t one. The truth was that I had two really good offers. They were different in some ways, and similar in others, and I was just going to have to make a decision.
I wound up taking the second offer, and on July 1st, almost four months exactly after finishing my Outreachy internship, I came on as a long term contractor at ButterCMS. I have to say, it’s been really great. I’ve learned a ton just over the last month, including during the process of pushing up my first big ticket, which was the new landing page! (EEEEEP check out that cutaway mask on the video!) There are a number of people on the team that are just freaking aces at what they do, and they’ve been so kind about taking the time out of their day to mentor me, and now I’m cramming stuff into my brain at the speed of light–back-end, front-end, best practices, it’s all there and great. I work a fairly regular schedule (by my own choice), but take off time when I want or need, which is such a godsend at this stage of my development–because there are a lot of days where I get four hours of work in and realize that yep, that’s it, that’s all the productivity my brain is going to make happen today, and then I can jet out early and read a book or go for a walk or go to the beach.
In other words, this whole, crazy experiment? It worked. I’m a paid developer. It feels like living the dream, and sure, there will be bad days and good days and bad jobs and good jobs, but I know for sure that I can do this and that people will pay me to do it, and I have to say, that’s pretty sweet, and I’ll be forever grateful to Outreachy for giving me that massive push to get me here.
(In which Maria gets real … and probably a bit emotional.)
NOTE: If you don’t want to read all the “how I got here” stuff, just skip down to the “Career Goals” heading below. I won’t judge!
When I woke up this morning, I had the stunning realization that I was, as of today, a month from the end of my Outreachy internship.
And then I realized that March 2020 was also the month that I got sick with presumptive COVID and my life fell apart. (You can read about that in my very first blog post, if you’re curious.) One thing I don’t specify in that post–hadn’t even been able to say out loud at the time–is that by mid-April, I was still too sick to go back to my physically demanding job in healthcare. In fact, I had no idea if I’d ever be well enough to go back. (Don’t panic! It took some time, but I’m totally good now.)
And the truth was, I also hadn’t been happy in that job for a while. At heart, I’m an intellectual person that’s almost entirely driven by the need to learn new things and solve problems. I’m also empathetic and (sometimes maddeningly) ethical. I chose my past career in healthcare because I thought it would mean a stable path where I could help people, practice my values, and be curious, analytical, and creative.
Instead, my job was dominated by the demands of insurers and what they’d pay for. Most of my brainpower was spent trying to justify services and filling out forms so that the hospital would get paid. And, in the oddest conundrum, I had tons of responsibility–I often worked with medically frail patients, so the stakes were high, including injury or death–but almost zero autonomy. (Hospitals only get paid for billable treatment minutes. Time you spend on documentation or peeing or comforting a patient dying from cancer is not billable time unless you can find a way to justify it as active treatment. This leads to a strong pressure across the entire healthcare industry to work off the clock, round minutes, or just outright lie, a topic probably best left for another time.) (FYI, I also really hate busywork. Can we all just start being honest about when we’re being productive and not? Time to lean is time to clean is a mantra that just doesn’t work when applied to creative work.)
So, in April of 2020, I made the decision to quit.
I wish I could convey how terrified I was, or how agonizing this decision was. I’d spent years (and a lot of money) preparing for a career in healthcare–graduate school, exams, getting licensed, getting that first job, getting a better job, getting specializations. I didn’t grow up rich, and my mom is one of those immigrant moms that I’m fully convinced would survive an apocalypse. Walking away from a “good job” (even one, I, um, actually could not physically do) with no plan in my early thirties was … insane. I cried a lot. I spent a lot of time complaining on the phone, laying on the ground feeling absolutely paralyzed, and apologizing to my (very supportive) husband about how I was no longer pulling my weight.
Looking back, it feels like I spent months doing nothing, but the truth is, I was only unemployed for a month or so before I tapped into a value I didn’t really even know I had yet: entrepreneurialism. I am lucky, in that I’ve walked a few interesting paths in life, and so I already had some skills. I’m a pretty good writer (I actually connected with my agent two years ago), so I put feelers out for editing gigs and freelance work, as well as stuff like formatting for self-publishing. I had some (almost a decade old) experience with WordPress, so I brushed on CSS and drummed up business making WordPress display websites for authors. I learn quickly, so I … actually started to make money. (Not a lot of money, but enough to keep me holding strong when the little voice in my head started yelling for me to go back to my old career.)
(One thing I learned pretty fast about myself? I freaking lovedriving my own ship.)
I also had a friend that for years has been trying to get me to learn Python/Django–and so, in April?(May?) of 2020, I cracked open Crash Course Python for the first time and wrote my first “Hello World” print statement.
Which brings me to why I’m telling you all of this: I am supposed to be writing about my career goals, but the truth is, the entire last year has felt like I was on some sort of crazy roller coaster. Anything too specific here is probably going to sound like a lie. A year ago, I was still neck-deep in treating patients in the hospital, trying to optimize things according to the eight-minute-rule. I had no idea that I was going to change careers, that I would learn Python. I had only a vague, second-hand understanding of what Django was (I honestly didn’t know what a CMS or a framework actually was.) I’d never heard of the request-response cycle or OOP or CBVs or MVPS.
I’m trying to tell you that a year ago, I’d never written a print statement–so the fact that we just launched an MVP that I constructed from the ground up and that WORKS and also looks kind of nice and plays nice with an API and has like a bunch of different views and incorporates some bootstrap and has like, 92 percent test coverage? Do you have any idea how crazy that is?
My mind is a constant symphony of imposter syndrome. I absolutely do not think I am a “real” programmer. But I am having the time of my life. I’m happier in my career (that I don’t think I have) than I’ve probably ever been. And as perfect is the enemy of good, I guess I’d better try to come up with some concrete career goals, because now that I’ve gotten a taste of this, I’m really not intending on going back.
Q: Are you looking for a job, internship, a grant, a volunteer position, or some type of other opportunity?
Okay, jokes aside: due to how much of a whirlwind this has all been, I don’t have a super-specific concept of what this next step looks like.
I know that I 1.) would like to be paid, preferably in a currency that a bank would recognize, and that 2.) I really need to wind up somewhere where there’s the chance for active mentorship. I love having a mentor. I feel like every time my mentor opens their mouth, I learn some new concept–not just about like, code, but about the practicalities of launching a project, or about how people operate, or about the different directions something can take. Knowing there’s someone there willing to dispense their knowledge on me if I do my part and bring my A-game means I bring my A-game.
Q: What types of work would you like to contribute to?
A: I’m really pretty flexible here–part of being new is that my primary focus is on acquiring the skills I need to one day be able to make better contributions to the causes I care about. That said, there are a lot of things that I love and am passionate about–like the environment, green energy, human rights, worker’s rights, privacy, right to repair, small business and antitrust protections, entrepreneurship, LGBT/queer causes, improving overall public health, and just about anything involving the arts and literature. (Also, I really, really, really, really, really love public libraries. They’re the foundation of democracy, yo.)
Q: What tools or skills do you have that would help you with that work?
A: I hear I learn fast, and that I’m good at planning ahead. I have a background in both writing/editing and healthcare, including an active license in my state in a rehabilitation field–which means a strong understanding of science, people skills, communication, US legislation relating to healthcare, hospital and insurer policy, etc.
I, strangely, enjoy pitching things–and after a few years of being an agented writer, have a decent amount of practice at it. I’ve also worked in property management and as an educator–meaning I’m good at organizing, prioritizing, helping people understand difficult concepts, and also “keeping calm and carrying on” when everything’s on fire. (Sometimes literally on fire–remind me to tell you that story later, and be sure to specify “dumpster” or “air conditioner”.)
I love Python, and I’m getting pretty good at Django–and now have experience bringing an absolutely spanking new web-app that interfaces with an API from the early planning stages to beta testing (and there are still four weeks to go in this internship!) I’m also a fair hand at CSS (yes, I can flexbox! I can center your DIVs, people! Vertically and horizontally!), have some decent experience with Bootstrap, and have now worked with a number of collaborative tools in Github/Gitlab, including the KANBAN board! (Why am I so excited about that? Is it because the word “Kanban” sounds so fun?)
Q: What tools or skills would you like to learn?
A: Oh, man. Everything. But since I have to start somewhere, I’d say 1.) I need to get better at JS and probably a JS framework (React or Vue?). I actually, um, really like CSS, although I understand a CSS preprocessor like SASS is the way to go, so I definitely need to look into that!
I really would like to learn a new python package, either something data-science or neural-networky, although I think that’s more of a long-term goal, here–like in the short-term, I want to focus on furthering my ability to create web apps using Django.
Q: How might your background make you a good team member?
A: I really prioritize good communication–like thrive on it. Is there anything better than when two people manage to communicate complex information in a mutually respectful way?
I have a unique background (multi-ethnic, multi-racial, multi-lingual, lived in a few countries, queer) that I think really helps when trying to understand someone that thinks differently from myself. I do speak Spanish, as well as conversational Korean (and obviously English.) And although I like taking on projects by myself, I also really enjoy collaboration.
Q: When are you available to start work?
A: Uh… (checks Outreachy calendar) March 2nd!
Q: Are you able to move? Are you looking for a remote job?
A: No, and yes, please. I love working from home. I have three different “work spots” in my house and just float between them all day. This last three months as a remote intern has been amazing.
Q: Are you looking for a full-time or a part-time position? Are you open to being a self-employed contractor?
A: Honestly, any of these three options sounds pretty great to me–and I’ve been a contractor (technically) for the last three months and really had a blast with that. I really enjoy having some control over my schedule, especially since I’m a night owl–but as I mentioned earlier, I would really like to have access to mentorship at my next position, which could be hard to come by as an independent contractor.
(Or, in which Maria recognizes the supreme irony of being 4 weeks late for a blog post about schedules and timelines.)
Just like the last blog post, I’m … super late on this one–although in this case, I do have a bit of an excuse: I was having a lot of trouble trying to figure out a way to make my current project really fit with the post requirements. Ultimately, I decided to kind of use it as a jumping-off point and kind of do my own thing, because perfect is the enemy of good, and I needed to get something written down.
(I’ve also made the executive decision that all .gifs will include Nick Miller from New Girl today, consider yourself warned.)
So, Outreachy Blog Post #4’s theme is supposed to “Modifying Expectations”–specifically talking about how project goals need to be modified due to things like delays in a kind of progress report.
I am … not having that problem. In fact, I’m kind of having the opposite problem–progress on the initial goals happened a faster than my mentor or I thought it would, and so the project scope has just grown a lot, and now I’m having to think around new features and make sure everything plays nicely with what I already managed to hammer out.
I’d love to toot my own here, but I think it’s really just a testament to the power of Django. Once you get the hang of the different views and their possibilities, especially when looking at layers of abstraction (more on formset factories later, lol) the next time you have to implement a view using those features, it’s often faster by orders of magnitude. As a result, we’ve been able to retool our goals to include additional features–like folding in another project, the Gitlab Lobby, into this project.
I was also very lucky, in that I did have some experience previous to this with front-end work–specifically tooling CSS for WordPress websites–and that TorProject has a pretty complete set of boostrap css files in their Style Guide. As a result, a lot of time-consuming decisions (e.g., what color scheme will I use? What will buttons look like?) were already made for me–and given that I’m trying to mirror the Gitlab instance, there was a clear and logical direction to go in with other decisions in terms of where various pieces of data should be displayed.
As a result, we’re right on schedule, even with the different hiccups we’ve experienced (let me tell you, I just about broke myself getting a full picture on class based views + custom formsets + formset factories and making that play nice with non-user based authentication AND user based authentication at the same time–but I got it eventually!)
At current, we’ve deployed the MVP out to some beta testers, with more to be added soon once I fix some of the issues that have, of course, already been revealed by the deploy. Once we get some feedback, we’ll be able to move out to the larger Tor community, as well as work on adding in some security features like rate-limiting and eventually making the site an onion site.
So … yeah! Knock on wood, but things seem to be going … good-ish? My mentor seems happy? Nobody is mad at me, and I’m able to sleep eight hours every night?
This is … real, right?
(P.S. I think the most fun part, has been discovering that yeah, this thing I built works–and it actually works pretty well! Because it’s a ticket reporting system–and because my project is one of the projects you can put tickets in on–I’ve actually switched to using my own project as the exclusive method by which I report issues and notes to myself (as opposed to doing it all inside of Gitlab.) It’s fast and lean, and I don’t need the other GitLab specific features … so why not?)
(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 is 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 interested 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.
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.
(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?
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?
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?)
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–
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.)
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.
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.
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.
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.
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.
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!
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.
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*)
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 …..
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–
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.
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–
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.
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.