RSSAmplifier

Blog

Allison Kaptur

akaptur.github.comRSS feed ↗20 posts

Latest posts

Love your bugs

In early October I gave a keynote at Python Brasil in Belo Horizonte. Here is an aspirational and lightly edited transcript of the talk. There is also a video available here . I love bugs I’m currently a senior engineer at Pilot.com , working on automating bookkeeping for startups. Before that, I worked for Dropbox on the desktop client team, and I’ll have a few stories about my work…

Two kinds of feedback

I often hear junior engineers or newcomers to a company say that they’re not getting enough feedback. It’s a common feeling, especially for people who are just leaving school and the predictable assignment->work->grade feedback loop that it creates. There’s lots of good advice for managers, mentors, and senior engineers about giving specific, actionable feedback – but…

2015 in review

My 2015 was a year of recovering from a serious injury and becoming a better engineer. I also gave four talks and published a chapter I’ve been working on for a while. I’m hopeful that 2016 will bring as many opportunities for growth and fewer broken bones. TPF I broke my knee – a tibial plateau fracture – at the beginning of February, 2015. It required surgery and several…

Effective Learning Strategies for Programmers

In early September I gave a keynote at Kiwi PyCon in New Zealand on effective learning for programmers. There were two pieces to the talk: one about mindset, and one about particular strategies we can use. The text below is an aspirational and lightly edited transcript of the mindset piece of that talk. There’s also a video available if you’d like to see the strategies piece. Recurse…

PS1 for Python3

I spend a lot of time flipping back and forth between Python 2.x and 3.x: I use different versions for different projects, talk to people about different versions, explore differences between the two, and paste the output of REPL sessions into chat windows. I also like to keep long-running REPL sessions. These two activities in combination became quite confusing, and I’d often forget which…

I'm joining Dropbox

Big news for me: I’m leaving Hacker School and going to work for Dropbox in San Francisco, joining Jessica McKellar’s team. I met Jessica when she was part of the first round of residents at Hacker School in fall 2012, and I’ve had tremendous respect for her work and leadership ever since. Dropbox has an impressive crop of Pythonistas (including Guido van Rossum, of course), and I couldn’t be more…

Debugging with pstree

I hit a very fun bug yesterday while trying to run a script that sends emails to certain subsets of Hacker Schoolers. When I tried to test the script locally, I discovered that one of the tables of the database, Batch , was missing from my local version. After briefly panicking and making sure that the actual site was still up, I could dig in. It turns out that my local version of psql was way out…

Rejected PyCon Proposals

“All accepted proposals are alike, but each rejected proposal is rejected in its own way” – Tolstoy, if he were on the PyCon talk review committee I’m building a collection of old PyCon talk proposals , particularly rejected ones. I think rejected proposals are more interesting than accepted ones, for a couple of reasons: See examples of anti-patterns Flipping through these…

Getting Started with Python Internals

I talk to a lot of people at Hacker School and elsewhere who have been programming Python for some time and want to get a better mental model of what’s happening under the hood. The words “really” or “why” often features in these questions – “What’s really happening when I write a list comprehension?” “Why are function calls considered…

The CPython Peephole Optimizer and You

Last Thursday I gave a lightning talk at Hacker School about the peephole optimizer in Python. A “peephole optimization” is a compiler optimization that looks at a small chunk of code at a time and optimizes in that little spot. This post explains one surprising side-effect of an optimization in CPython. Writing a test coverage tool Suppose that we’re setting out to write a test…

Of Syntax Warnings and Symbol Tables

A Hacker Schooler hit an interesting bug today: her program would sometimes emit the message SyntaxWarning: import * only allowed at module level . I had never seen a SyntaxWarning before, so I decided to dig in. The wording of the warning is strange: it says that star-import is only allowed at the module level, but it’s not a syntax error, just a warning. In fact, you can use a star-import…

PyCon prep: import is a keyword

Last week I had a ton of fun working with Amy Hanlon on her Harry Potter themed fork of Python, called Nagini. Nagini is full of magic and surprises. It implements the things you’d hope for out of a Harry Potter Python, like making quit into avada_kedavra , and many analogous jokes. Amy also had the idea to replace import with accio ! Replacing import is a much harder problem than renaming a…

Reading EBNF

One of the fun parts of pairing with Amy on Nagini was modifying the grammar of Python. You should try this – it’s easier than you think! Eli Bendersky has a great post with step-by-step instructions. 1 Modifying Python’s grammar starts in the Grammar/Grammar file. I’ve recently learned how to read this (which, for me, mostly means learning how to pronounce the…

PyCon prep: `require` in Ruby

I’m talking about import at PyCon in April. In the talk, we’ll imagine that there is no import and will reinvent it from scratch. I hope this will give everyone (including me!) a deeper understanding of the choices import makes and the ways it could have been different. Ideally, the structure will be a couple of sections of the form “We could have made [decisions]. That would…

Introduction to the Python Interpreter, Part 4: It's Dynamic!

[Edit: A significantly expanded version of this series appears as a chapter in The Architecture of Open Source Applications, volume 4, as A Python Interpreter Written in Python .] This is Part 4 in a series on the Python interpreter. Read Part 1 , Part 2 , and Part 3 . If you’re enjoying this series, consider applying to Hacker School , where I work as a facilitator. One of the things I was…

Introduction to the Python Interpreter, Part 3: Understanding Bytecode

[Edit: A significantly expanded version of this series appears as a chapter in The Architecture of Open Source Applications, volume 4, as A Python Interpreter Written in Python .] This is Part 3 in a series on the Python interpreter. Part 1 here , Part 2 here . If you’re enjoying this series, consider applying to Hacker School , where I work as a facilitator. Bytecode When we left our…

Introduction to the Python Interpreter, Part 2: Code Objects

[Edit: A significantly expanded version of this series appears as a chapter in The Architecture of Open Source Applications, volume 4, as A Python Interpreter Written in Python .] This is part of a series on the python interpreter. Part 1 here . When we left our heroes, they were examining a simple function object. Let’s now dive a level deeper, and look at this function’s code object.…

Introduction to the Python Interpreter, Part 1: Function Objects

[Edit: A significantly expanded version of this series appears as a chapter in The Architecture of Open Source Applications, volume 4, as A Python Interpreter Written in Python .] Over the last three months, I’ve spent a lot of time working with Ned Batchelder on byterun , a python bytecode interpreter written in python. Working on byterun has been tremendously educational and a lot of fun…

Python Puzzle Solutions

I really enjoyed seeing all the clever solutions to the python puzzle I posted . You’re all very creative! Here’s a discussion of the solutions I’ve seen, plus some clarifications. All spoilers are below the fold. First, clarifications. (These weren’t always clear in the problem statement, particularly if you got the problem off of twitter, so award yourself full marks as…

A Python puzzle

A couple of Hacker Schoolers were discussing an interesting corner of python today. We discovered a nice bit of trivia: there exist three lines of python code that display the following behavior: 1 2 3 4 5 6 7 8 9 10 11 12 >>> LINE_A >>> LINE_B >>> LINE_C False >>> LINE_A ; LINE_B ; LINE_C True >>> def my_function (): ... LINE_A ... LINE_B ... LINE_C >>> my_function () True What are the lines?…