This year has thrown a couple of tough interviews my way - nothing too difficult technically, they just didn't work out for one reason or another.
I've always been a nervous interviewer - clearly I have skills or I wouldn't have been employed as a developer for the last fifteen years. But when I'm under interview pressure, you could ask me to concatenate two strings and I might choke.
Okay, that's an exaggeration, but performance under pressure is certainly something I struggle with, and I know I'm not alone.
So it sucks that my gender should be an additional challenge. We have so many problems with diversity and inclusion in this industry, and so I have to consider how people perceive me because of my gender, for better or worse.
It wasn't always that way - my first programming job was on a dev team made up entirely of women. The only men in the building were artists. Even the 'IT guys' were women. I had no idea how unusual that was. The thing is, I don't think it was so unusual at the time.
Maybe that's why I didn't give a lot of thought to the teams I was joining in the years that followed. All that used to matter was the job itself. There were often a few other women around - I was only alone when the teams were small, 3-4 people, and I never felt isolated or alienated then.
I bring all this up because at one point during my recent job search, I went through the interview process with a company that gave me pause.
They sounded great on paper, they ticked all my boxes in terms of having challenging and varied work. But as we were setting up the tech interviews, I found out that I would be the only woman on a team of 50 or so. Not only that, but this company has a nearly 20-year history and has never employed a woman as a backend developer.
Whether the company's bias is deliberate or unconscious, it's clear that they have not made an effort to improve the diversity of their team in the decades before now. That's not just bad business planning, it's a huge red flag for me, an indicator that I would have a tough road ahead if I joined them.
And the weight of expectation would be crushing. If I did interview, I'd feel as though I were representing my entire gender. If I stumbled, it wouldn't just be me that looked bad in their eyes, it would be all women programmers.
Someone has to go first and open those doors for other women at this company, but why did it have to be me?
I wish I had the luxury of looking at a potential programming job solely on its merits. But these days I have to consider the environment I may be wandering into.
For the record, I did go through the first few rounds of the interview process, because practice is never a bad thing. However, I stopped short of the final steps because I knew I wouldn't be able to accept a job offer there. The whole situation was too fraught, I knew I wouldn't love it. I couldn't be certain that I would be treated with respect or even taken seriously.
I'm a competent, smart programmer and a good problem-solver who struggles with interview nerves. Interviews are hard enough, I shouldn't have to carry the extra weight of inclusion concerns with me too.
I don't know how to fix these things. I don't have a lot of answers.
But if you're a technology business that can't find women to bring onto your development team, maybe the problem is you - or at least your process. So adjust your message, try a different approach.
If you're not finding women to interview, then you're not looking - I promise you, we're everywhere.
And if you're interviewing and not finding any of us competent enough to hire, the problem is you. I guarantee it.
Incidentally, I finally wrapped up my job hunt and accepted a new position recently. I'll be starting next week, so for those of you who follow me on Twitter, expect to hear more about it there. The new position is a slight change of direction for me, and I'm a little uneasy about being in a position where I am no longer the expert on everything and instead have to learn a lot of new skills very quickly. I think it'll be an exciting challenge though.
Wish me luck!Tweet
I'm not sure how many of you know this, but in the interest of having a well-rounded life, I make a lot of things in my spare time. Over the years, I've been a costumer, a jeweller, a photographer, and a glass artist, among other things.
And I don't just mean dabbling - when I get interested in learning something, I throw myself into it almost to the point of fanaticism.
I make a lot of things. Which means I have a lot of things filling up my closets and drawers. There's only so much I can gift for birthdays and holidays. So lately I've opened up a shop on Etsy.
Opening shops in online marketplaces has meant keeping track of a lot of things around inventory. Etsy's listings manager is nice, but it doesn't really give me everything I want. For a while, I've been using a spreadsheet to keep track of my Etsy listings. But I'm also about to open a shop on Spoonflower. And I'm considering ArtFire. And I need a better way to manage the supplies I use. And I want to keep all this stuff in one place.
Naturally, because I'm a programmer, I'm building my own inventory manager.
I just started a day ago, so there's obviously a lot of work ahead - I hadn't given a lot of deep thought to what the account and item models needed to look like, so I've been making liberal use of migrations. (I should point out that I'm using Django 1.9. I love it - I've been mired in 1.3 for a while at work, used 1.6 for a few small personal projects, and made it onto 1.8 for some more recent work projects. I love the slight changes in the admin look, and finally having the built-in migrations is a dream come true.)
The items I'm storing use a base Item model with a lot of common fields like
price. But Etsy listings also use some values that are unique, such as Etsy-specific categories, when the item was made, a list of materials to use as search tags, and so on. Meanwhile, Spoonflower listings take a totally different set of parameters, such as material type, colors, and the type of repeat you want to use for your image.
For each marketplace (so far just Etsy and Spoonflower), I've added models for values that are only needed when the item is listed on that market.
class EtsyItem(models.Model): """ Fields used when the item is listed on 'Etsy' """ item = models.ForeignKey(Item) ... class SpoonflowerItem(models.Model): """ Fields used when the item is listed on 'Spoonflower' """ item = models.ForeignKey(Item) ...
This structure does assume that an Item wouldn't be listed on multiple markets - I may leave it that way and just add functionality to allow one Item's basic values to be copied to another record, to be associated with a different market so that each listing is unique.
I did also consider subclassing the Item model, but I'm serious about wanting to keep everything in one place - I'd rather not have to manage items in an Etsy list versus a Spoonflower list, etc. Maybe I'll change my mind about that and rewrite this whole thing.
But in the meantime, keeping everything together under that Item model presented a challenge - how to add/display the marketplace-specific data for an Item in the admin? I wanted to be able to show the Etsy model as an inline for an item listed for Etsy, a Spoonflower inline for a Spoonflower item, and so on.
Here's what I did (and of course you can see this in the inventory/admin.py in the repository):
from .models import EtsyItem, SpoonflowerItem class EtsyItemInline(admin.StackedInline): model = EtsyItem extra = 1 max_num = 1 class SpoonflowerItemInline(admin.StackedInline): model = SpoonflowerItem extra = 1 max_num = 1
I started with inlines for each of the custom models. Each Item should have only one of its respective inline objects - setting "extra=1" and "max_num=1" ensures that one instance of that inline will load but that no additional instances can be added to the page.
class ItemAdmin(admin.ModelAdmin): ... inlines = [ EtsyItemInline, SpoonflowerItemInline, ]
But I still needed a way to prevent all of the inlines from being loaded. An Item sold on Etsy should only have the EtsyItemInline, an Item to be sold on Spoonflower should only load SpoonflowerItemInline, and so on.
The first thing I needed to do was make it clear which online marketplace an Item is being sold on. So I went back to the model. My base Item model has a ForeignKey relationship to a seller account, which is in turn associated with a market name - I added a method extra_fields_by_market() to return a string (the desired inline name, based on the market name).
class Item(models.Model): account = models.ForeignKey(SellerAccount) ... def extra_fields_by_market(self): extra_inline_model = '' if self.account.market: extra_inline_model = str(self.account.market)+'ItemInline' return extra_inline_model
Then back in the admin, I overrode get_formsets_with_inlines(). This method yields formset/inline pairs, which allows me to limit which inlines are displayed for a given object.
I was able to use it to display a specific inline only when it matches the market on a base Item:
class ItemAdmin(admin.ModelAdmin): ... def get_formsets_with_inlines(self, request, obj=None): for inline in self.get_inline_instances(request, obj): # hide/show market-specific inlines based on market name if obj and obj.extra_fields_by_market() == inline.__class__.__name__: yield inline.get_formset(request, obj), inline
The value of obj.extra_fields_by_market() is that string returned by the model - 'EtsyItemInline', 'SpoonflowerItemInline', etc. If that matches the name one of the defined inlines, that inline is returned.
I should also note the other condition -
if obj. We don't know what market an Item will be listed on until after it's become an object in the database - this means a user would have to fill in the base Item fields, save, then come back to find the additional fields displayed as an inline.
I'll figure that out in a day or two, whenever I get a chance to turn my attention back to the project. Or I'll rewrite the whole thing a few times because I'm not quite satisfied with the data structure. But for now hopefully I've given you some new ideas for ways to manage inlines in your admins.Tweet
I'm in the middle of a job hunt right now, and so I'm thinking about a lot of issues as they relate to questions I'm asking during interviews. How do these companies determine 'culture fit'? How do I know whether or not their culture is inclusive? Will I be taken seriously, will I be listened to?
But the question that's obviously giving me the most headaches is whether or not I'll come off sounding knowledgeable during an interview. That's natural, right?
After 15 years in this field, I still suffer a little from impostor syndrome, and nowhere does that show itself more clearly than when I need to stifle it the most - during an interview.
Classic Q&A-style tech interviews are such a challenge for me. I am not great at regurgitating facts out of the standard library documentation. That's especially true when I'm being interviewed by a man (or group of men) - there's an unfortunate dynamic there that makes me question whether or not I belong.
But you know, that's not how I use Python every day anyway. You don't really want to gauge how well someone has memorized the standard library docs. In day-to-day programming work, it's not about what you've memorized - it's about knowing what to look up, knowing what questions to ask.
What you really want to know is how they approach problems, and how well they solve them. But asking someone to write a function or debug some code doesn't work as well either. I've had tasks like that as an interviewee. They might seem simple, the kinds of problem-solving exercises that might normally only take a few minutes, but when you're being watched, knowing you're being judged and scrutinized, those simple problems can become monumental.
And that's also not a reflection of how problems get solved in the real world. In a real development environment, there's collaboration, often there's more flexible time.
What I really prefer are project-based interviews - what are sometimes called take-home assignments - where I can develop some code beforehand and then explain my decisions to an interviewer. I've had a lot of success with this type of interview - from both sides of the process. It makes the interview feel less like a pressure cooker and more like an opportunity to show you what I can actually do.
How it works:
Then on the day of the interview, spend some time going over the code and examine the decision-making that went into it.
I understand the argument that this kind of exercise takes up too much free time for the interviewee. But as said interviewee, my position is this:
As programmers (particularly in open source), we're expected to write code in our spare time to contribute to open source libraries and projects, so that we can be judged on the quality/amount of that code. We're expected to write tech blogs and contribute in all kinds of other ways. All of that is unpaid work, usually done in our free time.
But somehow a few hours writing a take-home assignment is too much time to spend? For not-the-right-job, yes, I agree that it would be too much. But for the right job? I would feel just as excited about writing that code as I would about any other open source contribution.Tweet
After nearly four years at my current company, I am looking for something new. I love my team, and I'd happily stay here longer (the challenges laid at my feet over the years have been exciting). But the business has made a decision to eliminate Python, sunsetting all the current projects by the end of this year, so I am beginning my search for a new software development opportunity.
My favorite parts of dev work: Debugging, scripting, writing APIs, writing tests, deleting code, managing releases, optimizing data stores, writing documentation
Feel free to contact me at email@example.com.Tweet
(Note: These are the slides and speaker notes from my 2016 PyGotham talk, "Young Coders (or, 'How To Teach Python To Kids')".)
This talk is for any Python programmer who's interested in passing their knowledge on to younger students. And I really do mean any Python programmer. Teaching experience is nice to have but it’s not required.
If you're here, you probably already have some idea why you should teach. Coding is today's literacy, and too many students are still not being exposed to it in school. As Python developers, we have a unique opportunity to share our skills in our local communities and give kids an experience that could make a huge impact on their lives.
Do you remember that sense of wonder you felt the first time you realized what you could do with code? You could help someone else discover that same sense of excitement, and start them down the path towards a lifetime of exploration.
And organizing a class could change your life. It's a great way to introduce yourself to interacting with young students and will help you get started in teaching and public speaking.
I’m going to talk a little bit about the 'what' - the things you need to set up a class, like hardware, venues, and probably the most important thing: financing.
But where I want to spend the most time is in telling you how, and convincing you that teaching kids is easier than you think. All you really need are the desire and a little Python experience.
Why should you listen to me?
I’ve been involved in the Python community for about a decade now, but I actually began my professional life as a school teacher. I was only at it for a few years before I realized that I could never move out of my parents’ house on that salary, so I made a change. tl;dr I’ve been a successful developer for a little over 15 years now. But I didn't know how much I missed working with kids until I got the chance to come back to it.
In 2013, PyCon organizers came up with this idea for a new program called Young Coders. So that year, I flew into San Jose with this curriculum that I had pieced together at the last minute. And along with Katie Cunningham and a team of enthusiastic volunteers, we taught our first one-day intro to Python for young students.
Since then I've been lucky enough to teach both kids and adults through organizations like PyLadies and DjangoGirls. Teaching has become a dual passion for me, alongside programming.
Also in the years since, Python classes for kids have sprung up all over - at regional conferences and in after-school clubs.
And Young Coders at PyCon has continued to grow every year. For the two years that PyCon was in Montreal, we had the curriculum translated into French, and a couple of developers from the community up there taught it to local school kids. Then a few months ago in Portland, we introduced a new intermediate class to go along with the original beginner class, and that was a huge success. Kids did their first real scripting, worked with APIs, built their first web sites - it was so exciting.
As glad as I am for my teaching background, it's my programming background that's made all of this possible. Any of you out there could do it just as well, you just need a few pointers to get started.
I want to keep that momentum going. I want to keep Young Coders growing beyond just a couple of classes at conferences every year. And I want to do that by convincing all of you to organize and teach classes in your own communities.
So what do you need to organize a class? (To be clear, I’m talking about a one-day workshop, so a short-term learning experience, not the long-term experience you would expect from a public school classroom.)
I’m just going to skim over this list, but at the end I'll be giving you an online resource that has very complete descriptions of each of these things.
How you decide to set up your classroom is going to depend on a lot of different factors.
But the one thing I want to recommend strongly is that you use Raspberry Pis, and there are two important reasons why.
One is consistency: It's going to be easier to teach when every student is working in the same environment. You won't have to waste time with installs, or debugging issues that are unique to a particular operating system.
The other is reinforcement: You want your students to have a programming environment that's all theirs, that they can take home, so that they can keep going when they leave your classroom.
There are also some maybe less important reasons - Raspberry Pis (or their operating system) come with a lot of software already installed. There’s Idle - if you’ve never worked with it, Idle is a Python interpreter that has a few extra bells and whistles to make learning easier.
They also come with pygame - in the first few years of Young Coders, we’d have the kids edit constants (things like background colors or player avatar sizes) to see how they affected the games. And newer Raspberry Pis come with mcpi, a library that you can use to interact with Minecraft.
All of this means you’ll be purchasing a lot of Raspberry Pis. But they’re very affordable, and peripherals like keyboards and monitors can be rented for a very low cost. And as I said I'm going to give you some resources to help you figure out financing/sponsorship.
And of course you’re going to want some students.
I would recommend enrolling students 12 and older. The age cutoff is often a point of contention for Young Coders classes. And it’s understandable - parents want to get their kids into coding classes early, and for good reason, but sometimes it can be hard to tell if the kids are ready.
Here’s the thing: Kids develop new cognitive skills as they grow. Even beginner Python requires some abstract thinking, and among childhood development researchers it's generally believed that that ability emerges at around age 12. Sometimes before, sometimes after.
Personally, I think researchers’ views on that are going to begin to change as we see more kids getting into computing at earlier ages. But for now 12 is the usually agreed-upon age at which abstract thought becomes possible.
So you can put an 8- or 10-year-old in a CS classroom and they may be able to mimic what you type, but whether or not they'll comprehend it is not as certain. For those younger kids who are still in their concrete thinking phase, visual learning environments like Scratch and Turtle and Hopscotch are terrific alternatives.
(Note: Earlier in the day, the team from Codester gave a terrific talk titled 'Opening the Magic Box: Creating transitional Python libraries and IDE tools' about developing curriculum for classrooms. They spent a lot of time talking about these stages of childhood development and about what kinds of CS exposure are appropriate for different age groups. They also presented some great ideas for developing your own curriculum if you’re interested in doing that. When the PyGotham videos come out, you'll want to look for that one, but in the meantime the slides are here.)
So where do you find these kids anyway?
You’re going to be tempted to fill your classes with kids who are the children of other programmers you know from your local community.
But I would implore you to consider doing something different. And if you remember nothing else from this talk, remember this part.
You have this unique opportunity to impact kids who might not otherwise get much exposure to computing. Try reaching out to organizations like the Boys & Girls Clubs of America, and Big Brothers/Big Sisters. In Austin we have a group called GirlStart that’s like an after-school/summer camp program for girls who want to focus on STEM skills. Your town probably has something like that too.
So focus on diversity, focus on kids from different economic backgrounds. It might take a bit of Googling and going a little beyond your familiarity to find organizations to work with, but it’ll be worth it - you could really open up new doors for some of your students.
So what soft skills do you need to teach?
You should be comfortable illustrating simple concepts. For example, when we introduce variables in the beginner class, we might describe them as bowls. A bowl can contain all kinds of different things, different values. You can put something in the bowl, then you can take that thing out and put something new in the bowl.
And you don't need to 'dumb down' or be cutesie to talk to kids. Just be clear, keep your explanations simple - they’ll get it.
That said, do keep your examples relevant. The first year we taught Young Coders, as I said I brought in this curriculum that included some materials from an adult beginner class I'd helped with. I had the kids looking at a list of Beatles names - as in, the music group, John, Paul, George and Ringo - and I wanted them to use an index to choose their favorite musician.
I was, of course, greeted by blank stares. A 12-year-old does not know who the Beatles are. Some of you probably don't. So I went back to the hotel room that night and changed that to a list of colors, and that's what we’ve used ever since.
When it comes to teaching materials, you are always free to use the Young Coders curriculum - that's been open sourced since day one. The materials we use at PyCon were originally cobbled together from a lot of different sources, but they've been refined and tried and tested over the years and we know they work.
They’re filled with lots of little ‘a-ha!’ moments, lots of gradual skill-building, lots of little wins along the way to keep the kids engaged.
They're formatted like a presentation - a slide deck with extensive speaker notes that you can use if you find yourself needing a hand when you’re explaining concepts. We project these slides from a computer that also has Idle installed (so that we can alternate between the slides and demonstrating coding tasks).
You’ll find those slides, along with some detailed classroom setup notes, in this GitHub repository. The latest version is in a folder labelled ‘2016’ - that’s been updated for Python 3. As recently as 2015, though, we were still using Python 2, so that’s also available if you’re interested.
Of course if you want to write your own curriculum, there are lots of books and websites to draw inspiration from. Just remember a few things:
There's a common misconception that kids come to programming classes wanting only to make games.
I've done a little work with my local chapter of CSTA (that’s the Computer Science Teachers Association), and one thing I hear repeatedly is that they can’t get girls from AP math to enroll in the AP computer science classes. The girls think it's only going to be about making games (and they’re usually right), but they want more variety.
It’s also been my experience with the classes I’ve taught - sure, kids want game content, but they’re interested in other things too.
So show them that you can do more with Python than just making games - I promise, once they start talking to their computers with Python, they'll be no less excited.
It’s go time! Day of the class! You’re standing at the front! Now how do you talk to the kids?
It’s not going to be like this, I promise.
Kids are nothing to be afraid of, especially in this context. In fact, getting up in front of a roomful of kids is waaaay easier than speaking to a room full of adults.
And a class like this won't come with some of the same challenges you’d have teaching a primary school class. By age 12, students are already well familiar with basic classroom comportment - they’ll know how to behave and what’s expected of them.
And, too, your students will be there because they WANT to be, not because it’s compulsory. They’re eager to learn this stuff, and they'll soak it all up. I promise.
(By the way, that is a scene from Kindergarten Cop 2, Dolph Lundgren, straight to DVD. Don’t ask me how I know.)
Be collaborative. Don't just read code examples at the students. Interact with them. Ask questions, even if it's just asking them to guess what the results of an expression might be. Engage with them directly. They’ll surprise you with some intelligent questions, and they might even teach you a few things.
They'll be excited to be there, but they can also lose focus quickly if you aren’t mindful of the pace of the class.
Don't sweat the small details. There's only so much you can teach in a few hours, and the kids will need time beyond the classroom to work with and absorb all these new concepts.
Keep your mind on the big picture: You're teaching kids how to communicate with their computers, and that can be really huge and mind-blowing to someone who's never done any programming before.
Your students are not going to walk away with a thorough knowledge of Python. And that’s fine, that shouldn’t be your goal. What you are doing is planting a seed.
This is the site where you’re going to find all that information I mentioned earlier. If you navigate to the 'Teach' section, you’ll find details about all those physical resources, about how to get sponsorship money, where to find the kids, etc.
It’s a new site, just launched a few days ago, but it’s got pages and pages of teaching and organizing resources, along with an online version of the Young Coders curriculum, written in a tutorial format.
I wrote this talk as I was also writing the content for this web site, so if you read it and it all sounds a little familiar, that's why.
None of the site is that pretty - for any of it that looks nice or works well I have to give all the credit to Andrew Dupont, who did all the front end work. I am currently looking for a designer to work with to liven things up a bit. And I’m looking to port the tutorial to an iPython (or now, Jupyter) notebook, so if any of you are interested in collaborating on that, please get in touch with me.
There are going to be lots of additional resources added in the next few months - organizer tools, checklists, some things sort of similar to what DjangoGirls is using to help people organize their classes.
So if you're curious about something that you don't see up there, just ping me at @bshaurette - I'll do my best to get you an answer.Tweet
This year has thrown a couple of tough interviews my way - nothing too difficult technically, they just didn't work out for one reason or another.
I've always been a nervous interviewer - clearly I have skills or I wouldn't have been employed as a developer for the last fifteen ...Read More
I'm not sure how many of you know this, but in the interest of having a well-rounded life, I make a lot of things in my spare time. Over the years, I've been a costumer, a jeweller, a photographer, and a Read More
I'm in the middle of a job hunt right now, and so I'm thinking about a lot of issues as they relate to questions I'm asking during interviews. How do these companies determine 'culture fit'? How do I know whether or not their culture is inclusive? Will I be taken ...Read More
After nearly four years at my current company, I am looking for something new. I love my team, and I'd happily stay here longer (the challenges laid at my feet over the years have been exciting). But the business has made a decision to eliminate Python, sunsetting all the current ...Read More
(Note: These are the slides and speaker notes from my 2016 PyGotham talk, "Young Coders (or, 'How To Teach Python To Kids')".)
This talk is for any Python programmer who's interested in passing their knowledge on to younger students. And I really do mean ...Read More