Creating a Budget and Sticking to It
The hardest part of doing anything is starting. If you’re someone who has delayed getting serious about retirement savings, or budgeting in general, I would ...
The hardest part of doing anything is starting. If you’re someone who has delayed getting serious about retirement savings, or budgeting in general, I would ...
Take 100 young Americans starting out at age 25. By age 65, one will be rich and four will be financially independent. The remaining 95 will reach the tra...
Idempotence describes the property of operations in mathematics and computer science that means that multiple applications of the operation do not change th...
Retrospectives are a good catch-all for team health, bonding, and continuous improvement
A set of individuals can become a self-actualized team that can deliver working software despite uncertainty, not when they have perfect documentation or pro...
Lots of people claim to do Agile. Most believe it. Many are not doing the basics right.
Scrum is a fundamentally adaptable process. One of the core pieces is the retrospective, where the team can collaboratively change the process itself. Team m...
Often when I first start talking to someone new about Agile and/or Scrum, they have questions and occasionally objections. More often they just don’t underst...
I have been trying to write as much unobtrusive javascript as possibly lately. Mainly this means getting everything working without any javascript in the pi...
Website analytics tools are expected to do a lot. They need to allow you generate reports on metrics like sessions, pages/time per session, bounce rates, re...
Maybe this will save someone an hour... to set java.library.path from inside an ANT Java task, you need to set the parameter fork="true".
I've been using Splunk for several years. It's a great tool for log file visualization and analytics. One thing I use it for is to generate a graph of avera...
When I develop a website, I tend to go subdomain crazy. If the site is crazy.net, I probably configure www.crazy.net, admin.crazy.net, static.crazy.net, you...
REST APIs operate over HTTP, use standard verbs like GET and POST, expose a common-sense URL structure and return resources in a well-defined format, typical...
Buddy Build is a great tool for getting your app out to physical devices, whether that is during development, or in production. Their tool is fairly agnostic...
I have been aware of AWK as a "general purpose programming language that is designed for processing text-based data" since college. But until today I never s...
What if gmail went away tomorrow, or at least deleted all your mail? It may not be as far fetched as you think. It's always prudent to have a backup.
It's not uncommon for me to call my product manager over to my desk half a dozen times on a given day to look at what I'm working on. To speed things up, I ...
If you have a website that displays user-generated HTML (emails, rich text entry, etc), you likely want to scrub that HTML before you display it. At the ver...
Ever wanted to download your Amazon order history? Maybe you want to get it into a spreadsheet, or just keep it around in case Amazon decides to delete this...
Sometimes, bad xml happens to good people. In my case, I was getting a text stream back from a web-service call that proported to be xml, but was actually n...
Update: this app was decommissioned in 2022
This is a review of Leadership and Self-Deception: Getting Out of the Box by The Arbinger Institute.
Ran into a vexing issue this week when we upgraded to using Twitter Bootstrap. Some of our analytics graphs using Google Charts were suddenly broken in IE 7/...
The Django ORM is a wonderful thing. It makes it so easy to access the database, that sometimes you forget that it’s even happening. That is, until you open ...
The best feedback is tied to one or more specific examples, and also highlights the impact of what happened on the team or company.
On the surface, what you learn at a particular job takes the form of bullet points on your resume. But there are also deeper, more private lessons.
I have a few pieces of standard advice that I give to anyone starting out in software engineering. Join a startup, max out your 401k and start a blog. Why sh...
So, you’ve given your notice at your job. Now what? First off, stop coding. That’s right. Finish whatever small task you’re currently working on, but for the...
Interviews for software engineering positions are equal measures normal job interview and extemporaneous logic bomb de-arming with an audience. Most develope...
Celery is an awesome distributed asynchronous task system for Python. It’s great out of the box, but a couple of times I have needed to customize it. Specifi...
Celery ships with an configuration option called CELERY_ALWAYS_EAGER which causes all tasks to be executed immediately instead of being asynchronously execut...
Celery 2.3 has a few high level knobs to turn with regards to exception emails. You can whitelist exceptions by type. You can change the recipients, email s...
Celery has a built-in mechanism for sending untrapped errors to admins via email. This is great for trouble-shooting. Sending the emails directly to develop...
I ran into a mysterious, transient exception this week using django-celery.
Websites often need tasks that run periodically, behind the scenes. Examples include sending email reminders, aggregating denormalized data and permanently ...
How to manage risk for your project dependencies, i.e. when you need another team to put something on their roadmap.
If you’re working in corporate America, you’ve probably been to a lot of All Hands presentations.
Quick shout-out to the Blank Canvas Script Handler, a relatively unknown Google Chrome extension that brings @require support to userscripts in Chrome.
I ran into some trouble this week attaching my JSON Exception Handling to a new ColdFusion feature. Specifically, there was content from that page that surv...
When calling a ColdFusion end-point from an Ajax call, the caller is expecting a certain format. In my projects, that's usually JSON. Regardless, it would be...
The problem with object-oriented languages is they’ve got all this implicit environment that they carry around with them. You wanted a banana but what you...
At work, I have a set of long-term goals I'm supposed to be making progress on over the year. As a way to remind myself about them, I have a cron job setup ...
Varnish is an HTTP accelerator designed for content-heavy dynamic web sites. In contrast to other HTTP accelerators, such as Squid, which began life as a cl...
I ran into an interesting issue with the Django's CSRF (cross site request forgery) protection this week. Some users were reporting seeing the dreaded "CSRF...
You might assume that reading and writing files using the CSV format, being a simple and human-readable implementation, would be relatively pain free. You wo...
Given the rise in popularity of NoSQL solutions, typically set apart by their explicit forfeiture of traditional RDBMS features, you might think that age old...
I’ve recently been reading about dimensional schemas, aka star schemas. The whole idea seems to be to optimize for fast queries that are also simple to write...
Debugging code is more of an art than a science. It’s an art form that you will have plenty of time to practice as a software engineer.
You don’t have to choose just one organizational strategy for your entire company. A mature product org may be organized by goal, while a new product org has...
When you’re writing software, the feedback loop is king. Whether you’re implementing new functionality, changing server configuration or writing unit tests, ...
Recently at work we’ve been on a “servicifying” kick, meaning we’re slowly converting our monolithic Django app into separate services. To start, this just m...
This week I was creating my own version of the Django management command runserver. Like the built-in, I wanted to run a lightweight development only web ser...
Django Migratron is a schema migration tool for Django. Why write another schema migration tool? Here is how we stack up against other tools.
Say you have a bunch of developers that occasionally need Django shell access to production, but you want this to be an exceptional event. Here is a drop-in ...
In the battle for blazing fast unit tests, you need all the tools you can get at your disposal. Enter django-nose-lint, a new Nose plugin that lets you enfor...
Django fixtures were initially touted as a great way to pre-populate your database, mainly for testing. Over time, various community leaders have suggested t...
Mylyn is a “task lifecycle management framework” plugin for Eclipse. I’m not 100% sure what that means, but I know I really liked one particular feature. On ...
Anyone who has used a web browser has probably encountered the dreaded “form resubmission” dialog. This happens when the user tries to refresh or use the bac...
Unit tests need to be fast. Really fast. Some have suggested that speed is the defining characteristic of a unit test. But writing fast unit tests for Djang...
By definition session state is tied to the session. When you log out, you obviously don't want the server remembering who you are. Likewise, session state i...
Django has a "multiple databases" feature that lets you read/write data from more than just the default database. I'm going to show you how to switch databa...
Trying to get started with Django nose today on an existing project, I kept getting the following error trying to run my empty test suite:
Every week I take a look at a report generated by the excellent pgFouine tool for our production Postgres database. This week, there was a surprising query ...
New Relic is an excellent web application performance reporting tool. After a great experience using it on Heroku, I went to enable it for an existing self-...
Starting in Django 1.3, you can use the built-in staticfiles feature to bundle up css, javascript, images and other static resources for deployment to a CDN...
Dumping Django data to a fixture and loading it back up again are accomplished with the built-in management commands dumpdata and loaddata. However, loading...
Getting a brand new Django application running on Heroku is fairly simple. There is a great tutorial for it on devcenter.heroku.com. I would recommend going...
In my last Django project, we had a set of helper functions that we used a lot. The most used was helpers.first, which takes a query set and returns the fir...
This week we had a hackathon to develop a better internal dashboard page that shows things like records added to the system over time. Not having generated ...
Making ajax calls from javascript, even without a framework like jQuery, is pretty trivial. However, once you try to make the same request cross-domain, it ...
In Python, class attributes are evaluated and put into memory when the class is defined (or imported). For example, if you run the following code in an inte...
Django handles database connections transparently in almost all cases. It will start a new connection when your request starts up, and commit it at the end ...
One of the great things about Django's caching framework is that you can cache complex objects. Say you have a list of dictionaries representing favorite mo...
Typically, I try to implement a dynamic UI feature without javascript on the first pass. Then, I layer in a little javascript goodness to make it more respo...
For the most part, objects allocated by Django are short-lived, and are eligible for garbage collection when the request ends. In our case, we also have som...
Do you know how many database queries your Django pages are making? If you're like me, you probably don't know exactly. That's the beauty of the ORM; it abs...
Varnish is an HTTP accelerator designed for content-heavy dynamic web sites. In contrast to other HTTP accelerators, such as Squid, which began life as a cl...
Haystack is a great indexed search framework for Django. Getting started is easy, and it includes many data types and facets out of the box. However, one da...
Celery 2.3 has a few high level knobs to turn with regards to exception emails. You can whitelist exceptions by type. You can change the recipients, email s...
On pages that contain filter controls, such as search results pages, it's common for the filter selections to be put into the URL using query parameters. Th...
In my Django applications, I tend to use custom middleware extensively for common tasks. I have middleware that logs page runtime, middleware that sets cont...
Celery has a built-in mechanism for sending untrapped errors to admins via email. This is great for trouble-shooting. Sending the emails directly to develop...
Many websites have branding or "white label" functionality where the site can have custom styles per customer. A common use case with commercial products is...
Many times color palettes have lighter and darker variations of the same color. This may be used to convey relative importance, or for something as simple a...
I ran into an interesting issue with the Django's CSRF (cross site request forgery) protection this week. Some users were reporting seeing the dreaded "CSRF...
I ran into a mysterious, transient exception this week using django-celery.
This week, I noticed that there was a select query in our production system without a where clause, and it was running a lot. Tracking it down, I found the ...
My current Django project deals with resume files in Word/PDF format. In order to show a web preview of the file, it's necessary to translate these files to...
A common requirement for sites that deal with dates (most of them), is to display date and time values in the individual user's timezones. Luckily, there ar...
Sometimes, you want all the thumbnails you're creating to be the same dimensions. For example, your layout may require a certain width so that all the items...
Website analytics tools are expected to do a lot. They need to allow you generate reports on metrics like sessions, pages/time per session, bounce rates, re...
Very often when styling a webpage, you want to put content in a box. For example, say you have a standard box for contextual help content.
By default, Django will send an email to the site admins when a 500 error occurs. These emails contain all kinds of great information such as stacktrace, HT...
Forms are the primary way your users communicate with your website. Hopefully, the users are always entering data in the correct format, and the form always...
HTML5 has a bunch of nifty progressive enhancements to forms, one of which is placeholder text. Here is an example, along with the required code.
Say you have some Python code that prints to the console, and you want to re-use that code in a Django view, but output the print statements as HTML in the ...
Websites often need tasks that run periodically, behind the scenes. Examples include sending email reminders, aggregating denormalized data and permanently ...
By default, Django will use a mutli-select widget for rendering a ManyToManyField on a ModelForm. Switching it out for checkboxes is simple.
This week I was doing some refactoring, and started getting the following exception in Django's admin site. This was under Django 1.1.1, and Python 2.6.4.
Django defaults dates in forms to the format "2010-01-15". But changing the default format is fairly straight-forward, though there appears to be some confu...
By default, Django's authentication middleware only allows user names with 30 characters or fewer, containing only letters, digits and underscores. What if ...
There are two main ways to write tests in Django; doctests and unit tests. Units tests will be familiar to you if you're coming from Java. You basically wri...
In Django, settings.py is where you store configuration such as database connection strings, directory paths for static and media resources, as well as cach...
I've started a brand-new codebase at work. With new code comes the possibility of a new language/platorm. What we really needed was speed; we don't know exa...
Docker has only been around since 2013, but it seems like it’s all over my Twitter feed and RSS reader. I’ve gone trough the “Hello world” example in the pas...
When I’m evaluating new open source projects, there are a few things I look for. I look for how many stars they have on GitHub. I look at their issues in Git...
What are dotfiles?
What if gmail went away tomorrow, or at least deleted all your mail? It may not be as far fetched as you think. It's always prudent to have a backup.
Mysterious Error #5578:
Getting your HTML email to look the same on all mail clients is hard. Most clients only support a small subset of HTML. Outlook 2010 actually uses Word to d...
Reliably sending email without getting caught in spam filters is a full-time job, for someone. Surely not for an end-user, but for every end-user email, the...
Unless you have done a lot of work with generating and parsing emails, you are probably not intimately familiar with the details of the MIME format. Here is...
Spent a couple of hours tearing my hair out over the Facebook insights API this week. Say you have a Facebook page with an ID of 173304932707127, and a post ...
Facebook recently started enforcing OAuth 2.0 on app developers. Supposedly this was slated for Oct 1, 2011, but in practice it seems to have not started un...
Recently, users started reporting that our Facebook app was returning a blank screen. Tracking it down, it turned out that it was specifically when the user...
If you're using the Facebook JavaScript SDK to implement Facebook connect, your site may be more fragile than you think. Last weekend, I ran into an issue w...
The hardest part of doing anything is starting. If you’re someone who has delayed getting serious about retirement savings, or budgeting in general, I would ...
If you're using using a web-based bug tracking system (in my case, JIRA), or getting Subversion check-in emails in a web-based client, you may have seen URI...
Django fixtures were initially touted as a great way to pre-populate your database, mainly for testing. Over time, various community leaders have suggested t...
I got to play with Flask-Admin for the first time this week. Compared with Django admin, it’s very extensible, though the default UI is pretty ugly. In any c...
When writing Python integration tests, it’s useful to put slow code such as database access in a setUpClass method, so that they are only executed once for...
Ran into a vexing issue this week. I was getting errors trying to use absolute imports in a new flask app:
The Apple store checkout form redesign introduced me to the concept of in-context error messages.
Forms are the primary way your users communicate with your website. Hopefully, the users are always entering data in the correct format, and the form always...
HTML5 has a bunch of nifty progressive enhancements to forms, one of which is placeholder text. Here is an example, along with the required code.
My current project involves URL shortening. Like many URL shorteners, we wanted to get into frame bars. These are alternately called banners, share bars and...
Ran into a vexing issue this week when we upgraded to using Twitter Bootstrap. Some of our analytics graphs using Google Charts were suddenly broken in IE 7/...
Website analytics tools are expected to do a lot. They need to allow you generate reports on metrics like sessions, pages/time per session, bounce rates, re...
Every once in a while, you have to put in a heroic effort to diagnose a bug. When you finally figure it out, you want to run around the office singing “We ar...
One of the great things about git is how fast it is. You can create a new branch, or switch to another branch, almost as fast as you can type the command. Th...
Python’s built-in raw_input() function is a quick and dirty way to get text input from the user in your Python command line application. But it’s really only...
If you do frequent branch merges in any source control system, you have likely encountered merge conflicts. When two branches have legitimate differences, m...
What if gmail went away tomorrow, or at least deleted all your mail? It may not be as far fetched as you think. It's always prudent to have a backup.
Quick shout-out to the Blank Canvas Script Handler, a relatively unknown Google Chrome extension that brings @require support to userscripts in Chrome.
This is my personal system for staying on top of everything.
New Relic is an excellent web application performance reporting tool. After a great experience using it on Heroku, I went to enable it for an existing self-...
I’m just coming off a project where we decided to use Hadoop for the first time. We’re a Python shop developing an analytics feature. We have about 150m reco...
Sqoop is a tool for bulk copying data between a relational database like MySQL and HDFS or another Hadoop based data store like Hive or HBase. It can either ...
Having spent a good chunk of the last two weeks getting a prototype analytics system running, I thought I would write up my findings. I was pleased to find t...
By default Django Haystack makes updates to your Solr index available for searching immediately. It does this in the simplest way possible, it commits every ...
Haystack is a great indexed search framework for Django. Getting started is easy, and it includes many data types and facets out of the box. However, one da...
I’m just coming off a project where we decided to use Hadoop for the first time. We’re a Python shop developing an analytics feature. We have about 150m reco...
Sqoop is a tool for bulk copying data between a relational database like MySQL and HDFS or another Hadoop based data store like Hive or HBase. It can either ...
Though there is some decent documentation, I found that setting up Hive with a HBase back-end to be somewhat fiddly. Hopefully this guide will help you get s...
Wrote a simple connection pool for Happybase using socketpool.
Schema design in NoSQL is very different from schema design in a RDBMS. Once you get something like HBase up and running, you may find yourself staring blank...
Using the binary Thrift protocol through a load balancer can be a little tricky. While it works out of the box in HAProxy, you may run into some slight troub...
HappyBase is a friendly interface to interact with HBase from Python. It lets you perform basic HBase operations like get, put and scan. But say you have a b...
Most Pig tutorials you will find assume that you are working with data where you know all the column names ahead of time, and that the column names themselve...
Having spent a good chunk of the last two weeks getting a prototype analytics system running, I thought I would write up my findings. I was pleased to find t...
Starting in Django 1.3, you can use the built-in staticfiles feature to bundle up css, javascript, images and other static resources for deployment to a CDN...
Getting a brand new Django application running on Heroku is fairly simple. There is a great tutorial for it on devcenter.heroku.com. I would recommend going...
Hibernate Search shards allow you to break down your index data into separate Lucene directories. Typically, indexes would be broken down either into N equa...
If you are programmatically generating a query string and then parsing it with the query parser then you should seriously consider building your queries dire...
Hibernate Search shards allow you to break down your index data into separate Lucene directories. Typically, indexes would be broken down either into N equa...
If you are programmatically generating a query string and then parsing it with the query parser then you should seriously consider building your queries dire...
Apache Hive is a high level SQL-like interface to Hadoop. It lets you execute mostly unadulterated SQL, like this:
Though there is some decent documentation, I found that setting up Hive with a HBase back-end to be somewhat fiddly. Hopefully this guide will help you get s...
My wife and I recently bought a house in the San Francisco bay area. Having no family in the area, and no real ties to any neighborhood, it was surprisingly ...
HTML5 has a bunch of nifty progressive enhancements to forms, one of which is placeholder text. Here is an example, along with the required code.
Starting in Django 1.3, you can use the built-in staticfiles feature to bundle up css, javascript, images and other static resources for deployment to a CDN...
Every once in a while, you have to put in a heroic effort to diagnose a bug. When you finally figure it out, you want to run around the office singing “We ar...
My current project involves URL shortening. Like many URL shorteners, we wanted to get into frame bars. These are alternately called banners, share bars and...
Interviewing as an engineering manager is quite different from interviewing as an individual contributor.
Every software engineering interview I have ever participated in has involved a coding exercise. For one position, I would expect three two five separate cod...
Interviews for software engineering positions are equal measures normal job interview and extemporaneous logic bomb de-arming with an audience. Most develope...
Running a java JAR as a daemon in Linux is fairly easy, but it took me some digging to figure out how. This is using the new upstart init script functionali...
Say you have a large legacy ColdFusion app on top of Java that runs on Windows. File access is done both via java.io.File and by CFFILE (which in turn also ...
An aircraft company discovered that it was cheaper to fly its planes with less fuel on board. The planes would be lighter and use less fuel and money was sav...
When dealing with file paths, it's not uncommon to construct a path where the file separators are missing or duplicated. Ie, instead of c:\temp\test.txt, yo...
Maybe this will save someone an hour... to set java.library.path from inside an ANT Java task, you need to set the parameter fork="true".
I spent the afternoon playing around with Jersey in JBOSS. Jersey is a Java API for publishing REST web-services, and JBOSS is the application server we use...
So, you have a database with millions of phone numbers with free-for-all formatting. Ie, the UI does not enforce any constraints and the users are typing in...
Usually, when I want to call a remote web-service in Java, I would generate stub proxy classes at the command line with:
Mysterious Error #5578:
Every once in a while, you have to put in a heroic effort to diagnose a bug. When you finally figure it out, you want to run around the office singing “We ar...
A common pattern for less than instantaneous ajax calls is to show the user a "loading" animation while the ajax response is pending. If your animation is a...
I'm in the middle of writing a bookmarklet to screen scrape web pages. My back-end piece is having trouble parsing pages with lots of script tags. Since I d...
Making ajax calls from javascript, even without a framework like jQuery, is pretty trivial. However, once you try to make the same request cross-domain, it ...
Typically, I try to implement a dynamic UI feature without javascript on the first pass. Then, I layer in a little javascript goodness to make it more respo...
Historically, site administrators would measure their site performance by timing individual page renders. If your site is serving pages in less than 500ms, ...
If you're using the Facebook JavaScript SDK to implement Facebook connect, your site may be more fragile than you think. Last weekend, I ran into an issue w...
Website analytics tools are expected to do a lot. They need to allow you generate reports on metrics like sessions, pages/time per session, bounce rates, re...
Perhaps you have encountered a chained select control in your travels. The canonical example would be on Monster or CareerBuilder, picking your area of expe...
You might reasonably assume that it would be possible to fire a click event on an "A" element (link) via JavaScript, at which point the browser would fire a...
Part I defined what I mean by Unobtrusive JavaScript. Part II showed some specific examples. Now I want to talk a little more about why you might want to do...
I have been trying to write as much unobtrusive javascript as possibly lately. Mainly this means getting everything working without any javascript in the pi...
When calling a ColdFusion end-point from an Ajax call, the caller is expecting a certain format. In my projects, that's usually JSON. Regardless, it would be...
Generating a grid (table) view from the results of an Ajax call is a common Web 2.0 use case. But performance can be an issue, especially on IE7.
Problem: You want to copy a link into the clipboard from a web-app such that when you paste, you get the link URL AND the link text.
By default when JAX-WS auto-generates a proxy stub via wsimport, it will reference the live web version of the WSDL in the stub definition. This means that w...
A Yahoo HotJobs API project has been my first exposure to REST APIs. Usually, I'm working with SOAP web-services. Bullhorn is actually thinking about trying ...
A common pattern for less than instantaneous ajax calls is to show the user a "loading" animation while the ajax response is pending. If your animation is a...
I'm in the middle of writing a bookmarklet to screen scrape web pages. My back-end piece is having trouble parsing pages with lots of script tags. Since I d...
This jQuery snippet will turn an INPUT element into a hashtag input control. For example, if the user type "jobs business networking", it will translate it ...
We're very happy with our new-ish Selenium + Saucelabs setup for web site automation testing. But as easy as Selenium makes it to compose tests, you will in...
A common problem for a new site to have is for their users to occasionally submit the same form two or more times. For example, maybe they were adding a new...
The Apple store checkout form redesign introduced me to the concept of in-context error messages.
You might reasonably assume that it would be possible to fire a click event on an "A" element (link) via JavaScript, at which point the browser would fire a...
I have been trying to write as much unobtrusive javascript as possibly lately. Mainly this means getting everything working without any javascript in the pi...
Big props to Ubuntu for taking a risk and trying to innovate in the desktop experience arena. Unity is pretty cool, but pretty raw, too. For example, some a...
Deleting code is the highest return on investment activity for a software engineer
Do you know how many database queries your Django pages are making? If you're like me, you probably don't know exactly. That's the beauty of the ORM; it abs...
I love the Mac computing experience. Their laptop hardware, like their phones, feel solid and elegant. OSX usability is excellent, though it is myopically ge...
When you’re writing software, the feedback loop is king. Whether you’re implementing new functionality, changing server configuration or writing unit tests, ...
Canonical was founded with the goal of bringing polish, consistency and usability to the Linux desktop. Derided unfairly by some as not contributing much tec...
My current Django project deals with resume files in Word/PDF format. In order to show a web preview of the file, it's necessary to translate these files to...
Getting your HTML email to look the same on all mail clients is hard. Most clients only support a small subset of HTML. Outlook 2010 actually uses Word to d...
Haystack is a great indexed search framework for Django. Getting started is easy, and it includes many data types and facets out of the box. However, one da...
One of the reasons Lucene is awesomely fast is that it treats all data as strings. This is a perfect optimisation for most searching tasks. However, it does...
Hibernate Search shards allow you to break down your index data into separate Lucene directories. Typically, indexes would be broken down either into N equa...
If you are programmatically generating a query string and then parsing it with the query parser then you should seriously consider building your queries dire...
Canonical was founded with the goal of bringing polish, consistency and usability to the Linux desktop. Derided unfairly by some as not contributing much tec...
Leaders need to be actively managing their own mental well-being at work
How to manage risk for your project dependencies, i.e. when you need another team to put something on their roadmap.
You don’t have to choose just one organizational strategy for your entire company. A mature product org may be organized by goal, while a new product org has...
These are my basic expectations for managers that report to me
Strong relationships built in the small moments will be what you lean on to get through tough times
80% of impact for anything comes from the first 20% of the work
Good Strategy Bad Strategy using Apple circa 1997 as an example
If you’re working in corporate America, you’ve probably been to a lot of All Hands presentations.
This is my personal system for staying on top of everything.
Retrospectives are a good catch-all for team health, bonding, and continuous improvement
This post is a collaboration with Jason Ramirez, Frances Klein, and Maria Handberg
Spreadsheets could replace 80% of software
The magic of clean escalations is that 50% of the time, you come up with a compromise before you actually escalate. That’s just good collaboration.
Deleting code is the highest return on investment activity for a software engineer
Starting on the remote work journey
So, you want to be a manager?
A set of individuals can become a self-actualized team that can deliver working software despite uncertainty, not when they have perfect documentation or pro...
When a team gets a new manager, it can be a time of great uncertainty.
Teams operate best at certain sizes. Try sub-teams of 3-4 engineers, and interleaving active projects more often at the sprint boundaries.
How do you bootstrap a team to use story points?
The best feedback is tied to one or more specific examples, and also highlights the impact of what happened on the team or company.
Interviewing as an engineering manager is quite different from interviewing as an individual contributor.
All companies go through layoffs. As a manager, you can count on participating in one, someday.
Managers have a lot of practice giving people feedback. Most other engineers are only asked to give formal peer feedback once or twice a year. These are know...
How do you make sure that your team is not signing up for too much?
If you have a team that is unable to work effectively, there could be any number of causes. If you’re thinking about splitting the team into two or more team...
To communicate something to an organization of people, you need to repeat yourself. The more people involved, the more you will need to repeat yourself if yo...
In Agile, an Epic story is a potentially large placeholder story in the backlog. Typically they will be broken down into manageable stories during grooming b...
The traditional Iron Triangle tries to explain in graphical form how software projects need to make hard tradeoffs between scope, schedule and resources.
Any software engineer knows the feeling of being “in the flow”, or “in the zone”. It’s when you get a large block of uninterrupted time to just code. These p...
Every team meeting needs a primary owner. If you are the owner of the meeting, it’s your responsibility to make sure that this is a great use of team time.
False scheduling to match a patron’s desired date is more common in our discipline than elsewhere in engineering because it is VERY DIFFICULT to make a vi...
A tiger team is a diversified group of experts brought together for a single project, need, or event. They are usually assigned to investigate, solve, bui...
Coming off some annual management training, I realize that I need to write some of these learnings down, in order to actually internalize them. This is mostl...
One of the key innovations of Agile is that estimates should NOT be in hours, but in points. But it doesn’t just intuitively make sense. As a result, many te...
What percentage of your time at work do spend in meetings? If you’re a middle manager, it’s likely about 35% of your time, and if you’re in upper manageme...
I like to ask other managers what kind of questions they ask during their one on ones. Everyone has their own style, so I often get some interesting response...
Don’t do what I did, and spend 10 years headcount tracking in text documents
Ever wanted to download your Amazon order history? Maybe you want to get it into a spreadsheet, or just keep it around in case Amazon decides to delete this...
Any software engineer knows the feeling of being “in the flow”, or “in the zone”. It’s when you get a large block of uninterrupted time to just code. These p...
Every team meeting needs a primary owner. If you are the owner of the meeting, it’s your responsibility to make sure that this is a great use of team time.
What percentage of your time at work do spend in meetings? If you’re a middle manager, it’s likely about 35% of your time, and if you’re in upper manageme...
Unit tests need to be fast. Really fast. Some have suggested that speed is the defining characteristic of a unit test. But writing fast unit tests for Djang...
We recently starting using Varnish to cache un-authenticated requests to our web farm. It even has this great feature called grace mode, where it will keep ...
For months we were using RabbitMQ (with celery) with no real insight into what was going on inside the queue. Recently, we deployed the mangement plug-in, w...
If you have a production file server failing, you have serious problems. Client requests are failing. But they may not be failing quickly. If your product i...
These are my basic expectations for managers that report to me
The first step is getting to know each other
When a team gets a new manager, it can be a time of great uncertainty.
On the surface, what you learn at a particular job takes the form of bullet points on your resume. But there are also deeper, more private lessons.
The traditional Iron Triangle tries to explain in graphical form how software projects need to make hard tradeoffs between scope, schedule and resources.
Every team meeting needs a primary owner. If you are the owner of the meeting, it’s your responsibility to make sure that this is a great use of team time.
False scheduling to match a patron’s desired date is more common in our discipline than elsewhere in engineering because it is VERY DIFFICULT to make a vi...
Teams are also cross-functional; Team members must have all of the skills necessary to create an increment of work. - Scrum Guide
Coming off some annual management training, I realize that I need to write some of these learnings down, in order to actually internalize them. This is mostl...
What percentage of your time at work do spend in meetings? If you’re a middle manager, it’s likely about 35% of your time, and if you’re in upper manageme...
Agile requirements are ideally visual and should be barely sufficient, i.e. the absolute minimum required to enable development and testing to proceed wit...
This is a review of Leadership and Self-Deception: Getting Out of the Box by The Arbinger Institute.
Today is my first day of “unemployment” in the last 12 years. I’m switching jobs, soon to start at NerdWallet. This time, I decided to take a couple of weeks...
I like to ask other managers what kind of questions they ask during their one on ones. Everyone has their own style, so I often get some interesting response...
I have seen some Javascript in my time…
New Relic is an excellent web application performance reporting tool. After a great experience using it on Heroku, I went to enable it for an existing self-...
If you have an existing HTTP application that you want to enable SSL for, nginx provides a convenient reverse proxy mode. In this mode, nginx is just respon...
Trying to get started with Django nose today on an existing project, I kept getting the following error trying to run my empty test suite:
Facebook recently started enforcing OAuth 2.0 on app developers. Supposedly this was slated for Oct 1, 2011, but in practice it seems to have not started un...
The problem with object-oriented languages is they’ve got all this implicit environment that they carry around with them. You wanted a banana but what you...
Update: this app was decommissioned in 2022
In 2007, Dell launched their IdeaStorm site. It was the first example I had seen of a website where users can go to vote on features. From their FAQ:
I love the Mac computing experience. Their laptop hardware, like their phones, feel solid and elegant. OSX usability is excellent, though it is myopically ge...
I ran into an interesting issue with the Django's CSRF (cross site request forgery) protection this week. Some users were reporting seeing the dreaded "CSRF...
Calibrations are a group-based process for an organization to increase the equity of individual performance reviews across a large set of teams
Do you know how many database queries your Django pages are making? If you're like me, you probably don't know exactly. That's the beauty of the ORM; it abs...
Historically, site administrators would measure their site performance by timing individual page renders. If your site is serving pages in less than 500ms, ...
Generating a grid (table) view from the results of an Ajax call is a common Web 2.0 use case. But performance can be an issue, especially on IE7.
As someone with a young family and who is generally on track for retirement savings, I switched to an HSA and HDHP for two years, but then switched back
Set withholdings to zero, and pay up to an extra 15% of your bonus and RSU vest in the form of quarterly estimated taxes
Ran into an interesting edge case with pickle this week. I had a producer task that was querying objects from a database, and pickling them plus a reference ...
Most Pig tutorials you will find assume that you are working with data where you know all the column names ahead of time, and that the column names themselve...
Having spent a good chunk of the last two weeks getting a prototype analytics system running, I thought I would write up my findings. I was pleased to find t...
If you have a website that displays user-generated HTML (emails, rich text entry, etc), you likely want to scrub that HTML before you display it. At the ver...
How to manage risk for your project dependencies, i.e. when you need another team to put something on their roadmap.
You don’t have to choose just one organizational strategy for your entire company. A mature product org may be organized by goal, while a new product org has...
Good Strategy Bad Strategy using Apple circa 1997 as an example
This post is a collaboration with Jason Ramirez, Frances Klein, and Maria Handberg
The magic of clean escalations is that 50% of the time, you come up with a compromise before you actually escalate. That’s just good collaboration.
So, you want to be a manager?
I’m pleased to announce the first episodes of the Software Engineering Fireside Chat podcast are available for download. Along with my colleagues Scott Lobde...
Some mail hosts, like SendGrid, require you to use SASL authentication to relay mail through their systems. Many of those same hosts only want you to send m...
Reliably sending email without getting caught in spam filters is a full-time job, for someone. Surely not for an end-user, but for every end-user email, the...
I run a custom web-based email site. Some users requested the ability to smarthost any outbound mail from their accounts through an arbitrary server. In the...
Every week I take a look at a report generated by the excellent pgFouine tool for our production Postgres database. This week, there was a surprising query ...
This week we had a hackathon to develop a better internal dashboard page that shows things like records added to the system over time. Not having generated ...
Django handles database connections transparently in almost all cases. It will start a new connection when your request starts up, and commit it at the end ...
The official Postgres documentation covers log shipping (aka WAL Archiving, aka warm standby) in some depth. But it's still quite a lot to absorb. The basic...
Mylyn is a “task lifecycle management framework” plugin for Eclipse. I’m not 100% sure what that means, but I know I really liked one particular feature. On ...
Anyone who has used a web browser has probably encountered the dreaded “form resubmission” dialog. This happens when the user tries to refresh or use the bac...
Calibrations are a group-based process for an organization to increase the equity of individual performance reviews across a large set of teams
Epic estimation is as much about best-effort definition of scope and milestones as a cross-functional team, as it is about putting estimate values on roadmap...
Retrospectives are a good catch-all for team health, bonding, and continuous improvement
Don’t do what I did, and spend 10 years headcount tracking in text documents
The magic of clean escalations is that 50% of the time, you come up with a compromise before you actually escalate. That’s just good collaboration.
A set of individuals can become a self-actualized team that can deliver working software despite uncertainty, not when they have perfect documentation or pro...
Lots of people claim to do Agile. Most believe it. Many are not doing the basics right.
Teams operate best at certain sizes. Try sub-teams of 3-4 engineers, and interleaving active projects more often at the sprint boundaries.
Validating ONLY with tests is basically flying the plane on instrumentation, versus being able to look out the windshield. Flying visually and by muscle-memo...
How do you bootstrap a team to use story points?
It’s commonly said that everyone does Agile differently. In my experience, it’s also common to do basically whatever you want and call it Agile. It can be u...
What percentage of your time at work do spend in meetings? If you’re a middle manager, it’s likely about 35% of your time, and if you’re in upper manageme...
Agile requirements are ideally visual and should be barely sufficient, i.e. the absolute minimum required to enable development and testing to proceed wit...
Debugging code is more of an art than a science. It’s an art form that you will have plenty of time to practice as a software engineer.
Observe that for the programmer, as for the chef, the urgency of the patron may govern the scheduled completion of the task, but it cannot govern the actu...
In 2007, Dell launched their IdeaStorm site. It was the first example I had seen of a website where users can go to vote on features. From their FAQ:
A set of individuals can become a self-actualized team that can deliver working software despite uncertainty, not when they have perfect documentation or pro...
This is intended as a guide for new front-line product managers on my team. It could also double as an introduction for people brand new to the discipline. M...
How do you make sure that your team is not signing up for too much?
To communicate something to an organization of people, you need to repeat yourself. The more people involved, the more you will need to repeat yourself if yo...
In Agile, an Epic story is a potentially large placeholder story in the backlog. Typically they will be broken down into manageable stories during grooming b...
The traditional Iron Triangle tries to explain in graphical form how software projects need to make hard tradeoffs between scope, schedule and resources.
Words matter. When we use the term “product”, what do we mean? Are we talking about the same thing? In the context of tech startups, we often mean product wi...
Software is typically more complicated under the hood than it looks on the surface. A good product presents a simple and consistent user interface. Ideally, ...
The purpose of a bug report is to enable an engineer to fix the bug. In companies with no dedicated testing/QA resources, bug reports get generated by many d...
Agile requirements are ideally visual and should be barely sufficient, i.e. the absolute minimum required to enable development and testing to proceed wit...
80% of impact for anything comes from the first 20% of the work
For the most part, objects allocated by Django are short-lived, and are eligible for garbage collection when the request ends. In our case, we also have som...
Pyflakes is a popular linter for python, even if it isn’t being maintained anymore. One long standing request is to allow ignoring of specific warnings with ...
I got to play with Flask-Admin for the first time this week. Compared with Django admin, it’s very extensible, though the default UI is pretty ugly. In any c...
When writing Python integration tests, it’s useful to put slow code such as database access in a setUpClass method, so that they are only executed once for...
A common setup for web development is to have a virtual machine on your Mac running all your code. Typically this involves a shared folder containing the cod...
Everyone knows that you should write documentation for your code. Writing documentation actually is not that hard. Like any type of writing, the hardest part...
The python mock library is one of the awesome things about working in Python. No matter what code you’re unit testing, it’s possible to mock out various piec...
Ran into a vexing issue this week. I was getting errors trying to use absolute imports in a new flask app:
By default Django Haystack makes updates to your Solr index available for searching immediately. It does this in the simplest way possible, it commits every ...
For a dynamic language, it’s more difficult than it needs to be to import a module dynamically in Python. It’s very easy to just from foo import bar, but wha...
The Django development web server you get when you execute ./manage.py runserver optimizes for one thing; fast hot reloading when you change your Python code...
It’s a common pattern for command line tools to have multiple subcommands that run off of a single executable. For example, git fetch origin and git commit -...
Celery ships with an configuration option called CELERY_ALWAYS_EAGER which causes all tasks to be executed immediately instead of being asynchronously execut...
One of the great things about git is how fast it is. You can create a new branch, or switch to another branch, almost as fast as you can type the command. Th...
I can’t believe I just found out about this! If you use Python with unicode data, such as Django database records, you may have seen cases where you print a ...
A Python decorator wraps a function with another function. Classing examples are a @cache decorator or a @log decorator, which call the wrapped function and ...
The Problem
I’m just coming off a project where we decided to use Hadoop for the first time. We’re a Python shop developing an analytics feature. We have about 150m reco...
Apache Hive is a high level SQL-like interface to Hadoop. It lets you execute mostly unadulterated SQL, like this:
Wrote a simple connection pool for Happybase using socketpool.
Ran into an interesting edge case with pickle this week. I had a producer task that was querying objects from a database, and pickling them plus a reference ...
One of the strengths of a dynamic language is that it allows you to more easily work introspection and light weight meta-programming into your every day code...
HappyBase is a friendly interface to interact with HBase from Python. It lets you perform basic HBase operations like get, put and scan. But say you have a b...
Django Migratron is a schema migration tool for Django. Why write another schema migration tool? Here is how we stack up against other tools.
Having spent a good chunk of the last two weeks getting a prototype analytics system running, I thought I would write up my findings. I was pleased to find t...
There are at least a few decent libraries out there for mocking out HTTP calls in Python unit tests. The best solution looks like HTTPretty. One feature that...
The Django ORM is a wonderful thing. It makes it so easy to access the database, that sometimes you forget that it’s even happening. That is, until you open ...
Pyflakes is a popular linter for python, even if it isn’t being maintained anymore. One long standing request is to allow ignoring of specific warnings with ...
View all #2012pythonmeme posts by the community.
Python has a great standard library when it comes to invoking external processes. But one weakness it does have is that it’s not easy to communicate with a s...
Python’s built-in raw_input() function is a quick and dirty way to get text input from the user in your Python command line application. But it’s really only...
Some mail hosts, like SendGrid, require you to use SASL authentication to relay mail through their systems. Many of those same hosts only want you to send m...
In Python, class attributes are evaluated and put into memory when the class is defined (or imported). For example, if you run the following code in an inte...
Facebook recently started enforcing OAuth 2.0 on app developers. Supposedly this was slated for Oct 1, 2011, but in practice it seems to have not started un...
One of the great things about Django's caching framework is that you can cache complex objects. Say you have a list of dictionaries representing favorite mo...
We recently starting using Varnish to cache un-authenticated requests to our web farm. It even has this great feature called grace mode, where it will keep ...
Many times color palettes have lighter and darker variations of the same color. This may be used to convey relative importance, or for something as simple a...
In the past, when I needed to produce an XML file problematically, I typically turned to templating engines. Something like the following example in Django ...
Want to remove ASCII control characters from a string? Have Unicode control characters that can't be encoded into XML? Here is how to strip them with regex ...
Recently, users started reporting that our Facebook app was returning a blank screen. Tracking it down, it turned out that it was specifically when the user...
If you're using the Facebook JavaScript SDK to implement Facebook connect, your site may be more fragile than you think. Last weekend, I ran into an issue w...
My current project involves URL shortening. Like many URL shorteners, we wanted to get into frame bars. These are alternately called banners, share bars and...
Ever wanted to download your Amazon order history? Maybe you want to get it into a spreadsheet, or just keep it around in case Amazon decides to delete this...
My current Django project deals with resume files in Word/PDF format. In order to show a web preview of the file, it's necessary to translate these files to...
Say you have some Python code that prints to the console, and you want to re-use that code in a Django view, but output the print statements as HTML in the ...
Want to do some simple lex parsing in Python? Using shlex, you may be able to get something that meets your requirements almost for free. Here is an example...
Sometimes, bad xml happens to good people. In my case, I was getting a text stream back from a web-service call that proported to be xml, but was actually n...
This week I was doing some refactoring, and started getting the following exception in Django's admin site. This was under Django 1.1.1, and Python 2.6.4.
Unless you have done a lot of work with generating and parsing emails, you are probably not intimately familiar with the details of the MIME format. Here is...
There are two main ways to write tests in Django; doctests and unit tests. Units tests will be familiar to you if you're coming from Java. You basically wri...
In Django, settings.py is where you store configuration such as database connection strings, directory paths for static and media resources, as well as cach...
I've started a brand-new codebase at work. With new code comes the possibility of a new language/platorm. What we really needed was speed; we don't know exa...
Mint.com is a great personal finance tool. I started using it once I made the switch to Linux at home. I used to use Quicken, but I really didn't want to co...
Want to backup your Blogger posts? Here is a quick Python script that does just that. It will create an HTML file for each post, with the subject of the pos...
View all #2012pythonmeme posts by the community.
Due to our regular QA engineer being out on vacation, I once again has the opportunity to do a tour of duty in QA. This time, for a big mobile release. I pre...
The purpose of a bug report is to enable an engineer to fix the bug. In companies with no dedicated testing/QA resources, bug reports get generated by many d...
We all tend to tie our self-esteem strongly to the quality of the product we produce - not the quantity of the product, but the quality. [Lister, DeMarco: "...
For months we were using RabbitMQ (with celery) with no real insight into what was going on inside the queue. Recently, we deployed the mangement plug-in, w...
Perl makes the easy things easy and the hard things possible. - Larry Wall
Buddy Build is a great tool for getting your app out to physical devices, whether that is during development, or in production. Their tool is fairly agnostic...
Good Strategy Bad Strategy using Apple circa 1997 as an example
This is my personal system for staying on top of everything.
This post is a collaboration with Jason Ramirez, Frances Klein, and Maria Handberg
A set of individuals can become a self-actualized team that can deliver working software despite uncertainty, not when they have perfect documentation or pro...
Validating ONLY with tests is basically flying the plane on instrumentation, versus being able to look out the windshield. Flying visually and by muscle-memo...
The best feedback is tied to one or more specific examples, and also highlights the impact of what happened on the team or company.
The purpose of a bug report is to enable an engineer to fix the bug. In companies with no dedicated testing/QA resources, bug reports get generated by many d...
What percentage of your time at work do spend in meetings? If you’re a middle manager, it’s likely about 35% of your time, and if you’re in upper manageme...
This post is list of articles, blogs and other resources that I commonly reference.
I like to ask other managers what kind of questions they ask during their one on ones. Everyone has their own style, so I often get some interesting response...
I have a few pieces of standard advice that I give to anyone starting out in software engineering. Join a startup, max out your 401k and start a blog. Why sh...
I have seen some Javascript in my time…
Debugging code is more of an art than a science. It’s an art form that you will have plenty of time to practice as a software engineer.
Observe that for the programmer, as for the chef, the urgency of the patron may govern the scheduled completion of the task, but it cannot govern the actu...
Take 100 young Americans starting out at age 25. By age 65, one will be rich and four will be financially independent. The remaining 95 will reach the tra...
Scrum is a fundamentally adaptable process. One of the core pieces is the retrospective, where the team can collaboratively change the process itself. Team m...
Want to remove ASCII control characters from a string? Have Unicode control characters that can't be encoded into XML? Here is how to strip them with regex ...
When dealing with file paths, it's not uncommon to construct a path where the file separators are missing or duplicated. Ie, instead of c:\temp\test.txt, yo...
When we left off, I had set out to replace any ampersand outside a CDATA segment with the XML encoded version. Instead of ditching the regex approach and us...
People understand instinctively that the best way for computer programs to communicate with each other is for each of the them to be strict in what they emi...
Starting on the remote work journey
Managers have a lot of practice giving people feedback. Most other engineers are only asked to give formal peer feedback once or twice a year. These are know...
Ideally, the applications that you're working with already supports the syslog standard. Failing that, it's often necessary to suck a regular text log file ...
I've been using Splunk for several years. It's a great tool for log file visualization and analytics. One thing I use it for is to generate a graph of avera...
In the past, when I needed to produce an XML file problematically, I typically turned to templating engines. Something like the following example in Django ...
How to manage risk for your project dependencies, i.e. when you need another team to put something on their roadmap.
Retrospectives are a good catch-all for team health, bonding, and continuous improvement
Lots of people claim to do Agile. Most believe it. Many are not doing the basics right.
I'm in the middle of writing a bookmarklet to screen scrape web pages. My back-end piece is having trouble parsing pages with lots of script tags. Since I d...
Epic estimation is as much about best-effort definition of scope and milestones as a cross-functional team, as it is about putting estimate values on roadmap...
Lots of people claim to do Agile. Most believe it. Many are not doing the basics right.
Teams operate best at certain sizes. Try sub-teams of 3-4 engineers, and interleaving active projects more often at the sprint boundaries.
How do you bootstrap a team to use story points?
Teams are also cross-functional; Team members must have all of the skills necessary to create an increment of work. - Scrum Guide
Scrum is a fundamentally adaptable process. One of the core pieces is the retrospective, where the team can collaboratively change the process itself. Team m...
Often when I first start talking to someone new about Agile and/or Scrum, they have questions and occasionally objections. More often they just don’t underst...
Making ajax calls from javascript, even without a framework like jQuery, is pretty trivial. However, once you try to make the same request cross-domain, it ...
Depending on who you listen to, XSS is now the top computer security vulnerability, having passed the venerable SQL injection in 2007. If you're a developer...
The easiest way to guess a password isn't to guess it at all, but to exploit the inherent insecurity in the underlying operating system. Bruce Schneier
We're very happy with our new-ish Selenium + Saucelabs setup for web site automation testing. But as easy as Selenium makes it to compose tests, you will in...
Say you have a bunch of developers that occasionally need Django shell access to production, but you want this to be an exceptional event. Here is a drop-in ...
Here are the basic steps to mount a Windows share under Linux:
I run a custom web-based email site. Some users requested the ability to smarthost any outbound mail from their accounts through an arbitrary server. In the...
Perl makes the easy things easy and the hard things possible. - Larry Wall
By default Django Haystack makes updates to your Solr index available for searching immediately. It does this in the simplest way possible, it commits every ...
Haystack is a great indexed search framework for Django. Getting started is easy, and it includes many data types and facets out of the box. However, one da...
If you do frequent branch merges in any source control system, you have likely encountered merge conflicts. When two branches have legitimate differences, m...
Reliably sending email without getting caught in spam filters is a full-time job, for someone. Surely not for an end-user, but for every end-user email, the...
What is Splunk, and how can you make the best use of it as an engineer? Splunk is first and foremost a hosted web-based tool for your log files. It gives you...
Have a problem staying under the Splunk free edition cap of 500MB/day? Splunk is no help. It silently logs violations, only taking action finally by shuttin...
I've been using Splunk for several years. It's a great tool for log file visualization and analytics. One thing I use it for is to generate a graph of avera...
This week, I noticed that there was a select query in our production system without a where clause, and it was running a lot. Tracking it down, I found the ...
Back in the caveman days, there was only one way to JOIN tables in a SQL query. Now, we refer to this as "table list", "theta" or simply "implicit" JOIN syn...
Trying to get started with Django nose today on an existing project, I kept getting the following error trying to run my empty test suite:
Sqoop is a tool for bulk copying data between a relational database like MySQL and HDFS or another Hadoop based data store like Hive or HBase. It can either ...
If you're writing a Facebook app, you may have to jump through hoops to test it out against your local development machine. Facebook requires that you confi...
If you have an existing HTTP application that you want to enable SSL for, nginx provides a convenient reverse proxy mode. In this mode, nginx is just respon...
Python has a great standard library when it comes to invoking external processes. But one weakness it does have is that it’s not easy to communicate with a s...
If you're using using a web-based bug tracking system (in my case, JIRA), or getting Subversion check-in emails in a web-based client, you may have seen URI...
Ideally, the applications that you're working with already supports the syslog standard. Failing that, it's often necessary to suck a regular text log file ...
I've been using Splunk for several years. It's a great tool for log file visualization and analytics. One thing I use it for is to generate a graph of avera...
Good Strategy Bad Strategy using Apple circa 1997 as an example
Don’t do what I did, and spend 10 years headcount tracking in text documents
Validating ONLY with tests is basically flying the plane on instrumentation, versus being able to look out the windshield. Flying visually and by muscle-memo...
Unit tests differs from integration testing primarily in terms of what you’re testing for. Where as with integration tests, you testing for whether the entir...
The python mock library is one of the awesome things about working in Python. No matter what code you’re unit testing, it’s possible to mock out various piec...
In the battle for blazing fast unit tests, you need all the tools you can get at your disposal. Enter django-nose-lint, a new Nose plugin that lets you enfor...
Python has a great standard library when it comes to invoking external processes. But one weakness it does have is that it’s not easy to communicate with a s...
A common requirement for sites that deal with dates (most of them), is to display date and time values in the individual user's timezones. Luckily, there ar...
What are dotfiles?
One of the strengths of a dynamic language is that it allows you to more easily work introspection and light weight meta-programming into your every day code...
This jQuery snippet will turn an INPUT element into a hashtag input control. For example, if the user type "jobs business networking", it will translate it ...
Canonical was founded with the goal of bringing polish, consistency and usability to the Linux desktop. Derided unfairly by some as not contributing much tec...
Whenever I get up from my desk, I reflexively lock my workstation. Ever since upgrading to Ubuntu 11.10, this has failed to put my monitors into suspend mod...
Running a java JAR as a daemon in Linux is fairly easy, but it took me some digging to figure out how. This is using the new upstart init script functionali...
Big props to Ubuntu for taking a risk and trying to innovate in the desktop experience arena. Unity is pretty cool, but pretty raw, too. For example, some a...
While the vpn client feature in the Ubuntu UI is very good, sometimes you need to VPN purely from the command-line. For example, if you need to VPN from a h...
Everyone assumes that using keyboard shortcuts is more efficient than using the mouse. But by how much? One 2005 study found that keyboard shortcuts are app...
If you're like me, you ssh into the same small set of machines over and over. Maybe sometimes you run commands that sit on top of ssh, like scp for file cop...
If you're using using a web-based bug tracking system (in my case, JIRA), or getting Subversion check-in emails in a web-based client, you may have seen URI...
Here are the basic steps to mount a Windows share under Linux:
I took some time this week to figure out how to rotate just my Dell 2005FPW in an Ubuntu dual-monitor setup. The graphics card is an Nvidia GeForce 6200 LE,...
The Apple store checkout form redesign introduced me to the concept of in-context error messages.
Unit tests need to be fast. Really fast. Some have suggested that speed is the defining characteristic of a unit test. But writing fast unit tests for Djang...
Whenever I get up from my desk, I reflexively lock my workstation. Ever since upgrading to Ubuntu 11.10, this has failed to put my monitors into suspend mod...
Big props to Ubuntu for taking a risk and trying to innovate in the desktop experience arena. Unity is pretty cool, but pretty raw, too. For example, some a...
Typically, I try to implement a dynamic UI feature without javascript on the first pass. Then, I layer in a little javascript goodness to make it more respo...
If you're using the Facebook JavaScript SDK to implement Facebook connect, your site may be more fragile than you think. Last weekend, I ran into an issue w...
Perhaps you have encountered a chained select control in your travels. The canonical example would be on Monster or CareerBuilder, picking your area of expe...
Running a java JAR as a daemon in Linux is fairly easy, but it took me some digging to figure out how. This is using the new upstart init script functionali...
Quick shout-out to the Blank Canvas Script Handler, a relatively unknown Google Chrome extension that brings @require support to userscripts in Chrome.
The Django development web server you get when you execute ./manage.py runserver optimizes for one thing; fast hot reloading when you change your Python code...
Vagrant is typically used to provide local, uniform and repeatable development virtual machines. Repeatable is given little importance in the documentation, ...
Most web based tech startups are deploying to cloud hosted Linux machines. At the same time, only a small percentage of engineers actually run Linux on their...
Here are some quick recipes for getting information from varnish about top offending IP addresses, which pages those IP addresses are accessing, and which I...
We recently starting using Varnish to cache un-authenticated requests to our web farm. It even has this great feature called grace mode, where it will keep ...
Varnish is an HTTP accelerator designed for content-heavy dynamic web sites. In contrast to other HTTP accelerators, such as Squid, which began life as a cl...
Mylyn is a “task lifecycle management framework” plugin for Eclipse. I’m not 100% sure what that means, but I know I really liked one particular feature. On ...
Anyone who has used a web browser has probably encountered the dreaded “form resubmission” dialog. This happens when the user tries to refresh or use the bac...
What are dotfiles?
This is my rifle. There are many like it, but this one is mine. - Rifleman’s Creed
I'm trying to make the switch from Eclipse to vim. I've started compiling a vimrc github project. So far, the only customization I had to implement myself w...
Quick hit today. Ever open a file in vim, only to realize that you need sudo to write to it? Usually, you have to exit out of vim, open vi as sudo, and make...
While the vpn client feature in the Ubuntu UI is very good, sometimes you need to VPN purely from the command-line. For example, if you need to VPN from a h...
I have seen some Javascript in my time…
Interviews for software engineering positions are equal measures normal job interview and extemporaneous logic bomb de-arming with an audience. Most develope...
Epic estimation is as much about best-effort definition of scope and milestones as a cross-functional team, as it is about putting estimate values on roadmap...
How do you bootstrap a team to use story points?
In the past, when I needed to produce an XML file problematically, I typically turned to templating engines. Something like the following example in Django ...
Sometimes, bad xml happens to good people. In my case, I was getting a text stream back from a web-service call that proported to be xml, but was actually n...
A Yahoo HotJobs API project has been my first exposure to REST APIs. Usually, I'm working with SOAP web-services. Bullhorn is actually thinking about trying ...
A Yahoo HotJobs API project has been my first exposure to REST APIs. Usually, I'm working with SOAP web-services. Bullhorn is actually thinking about trying ...
I took some time this week to figure out how to rotate just my Dell 2005FPW in an Ubuntu dual-monitor setup. The graphics card is an Nvidia GeForce 6200 LE,...
If you have a website that displays user-generated HTML (emails, rich text entry, etc), you likely want to scrub that HTML before you display it. At the ver...
Depending on who you listen to, XSS is now the top computer security vulnerability, having passed the venerable SQL injection in 2007. If you're a developer...
My current project involves URL shortening. Like many URL shorteners, we wanted to get into frame bars. These are alternately called banners, share bars and...