I Should Have Known

Teamwork Doesn’t Have to Suck

Note: This is a repost from my Medium account, https://medium.com/@ericsaupe/teamwork-doesnt-have-to-suck-741fe1a9ec61

Let’s face it, teamwork can suck. A new project comes up, the team gets together and inevitably a small portion of the team does the majority of the work. Deadlines come, tensions run high, and suddenly you dread waking up in the morning to head back into the hell that has been created. We’ve all been there. Let’s talk about how to make all of our teams better not only for our own sanity but for every member of our teams.

Teams can be great!

Move together

Hard working team members can quickly lose their drive without a destination in sight. A common and achievable goal should be the first step to improving any team. Each member should know their role and how they contribute to moving towards that end.

“Teamwork is the ability to work together toward a common vision. The ability to direct individual accomplishments toward organizational objectives. It is the fuel that allows common people to attain uncommon results.”

— Andrew Carnegie

Recently I was responsible with leading a complete rewrite of our company’s eCommerce site. The goal was simple, get us on a new open-source-based platform and clean out the crap. Over the years we had made customizations to our old open-source-based eCommerce platform to the point of forking it; effectively destroying the benefit of open-source technology. This project was our attempt at getting back into the community and “going vanilla”.

Bringing us together were the baby steps that we each made to move our large project toward the finish line. Those baby steps came from small tasks rather than large epics. Developers had clear features to implement, QA had specific guidelines to follow, and project managers had direct questions that needed to be answered. Everyone had something to contribute and because the tasks were small and clearly defined it was simple to feel like we were moving as each one was completed. After months of hard work we successfully finished the project and grew closer through our achievement.

That sense of movement, even if small, drives momentum and encourages teams. Set a goal, define a path, and let everyone run.

Cut the weight

Over the years I’ve worked on good teams and bad. The biggest team killer is a bad team member. One person can easily drag an entire team down due to their attitude, lack of communication skills, or the work they produce. The hard truth is that person has to go.

That can be hard to hear and even harder to execute. Do we just fire them? Move them to another team? Yes! Whatever it takes to get the toxic person out of your group is the answer. I once worked on a team where everyone was very communicative until this one person came around. Then everyone tensed up and were afraid to share their opinions for fear of being confronted about their ideas. This kills the team.

No organization or project is worth holding hostage over one team member. Shake it up and lose them. If it’s not working out then make that change sooner than later. The team will benefit greatly.

Build each other up

Praise never seems to come often enough. We should share in our defeats but build up individual accomplishments. When something goes wrong the team together holds the responsibility. When something goes right the individual people should be praised for their great work. This does two things to the morale of a team. First, a single person is not criticized for damaging your project. We are moving this thing together so we should share the load when things get heavy. Someone falters and we all get behind them to get everyone back on track. Second, individuals can see that their contributions are noted and matter. Even the person who may not be at the forefront of day-to-day additions should be thanked for every bit of effort given to the team.

Whatever good things we build end up building us.

— Jim Rohn

I’ve worked on projects where one or two team members contributed to a very high-profile feature that was talked about immensely while others did the less glamorous features and bug fixes. Were the latter’s contributions any less to the overall movement of the project? No, and they should be praised openly for doing their part as well as the others for the high-profile feature.

One way that we keep the praise going is using a Slack extension I created called Sticker Chart Party!. It gives your Slack team a digital emoji sticker chart similar to grade school days where we can quickly give a sticker every time someone does something noteworthy. Messages can be attached to the emoji to see why people got them and it’s a fun way to thank people for their contributions and help.

Sticker Chart Party! makes praise easy

My current team has grown closer together thanks to constantly high-fiving each other over all of our victories and banding together during the struggles. A good team should make every member feel comfortable and supported without alienation.

Small changes again and again

Iteration is key to life. Teams should always be evolving. As new people come and go the dynamic will always be changing. Open discussion should be encouraged on what is working and what isn’t and how to improve it. Tools, processes, and work styles should all be on the table for debate. If an idea is presented on making work life better by allowing for a remote work policy it should be discussed and tried. My current company just decided to go remote-first opting to allow employees to work wherever they feel comfortable that day whether it be at home, the office, or somewhere else.

Don’t be afraid to change how the team is working. I’ve seen people come in to a job and just settle into the routine saying, “That’s just the way it is here”. In all the companies I’ve worked for there is always room for change and improvement. Maybe as small as putting up art on the walls or shifting schedules around. Whatever makes the team happier will make them more dedicated and productive.

Be the change

It’s better to ask for forgiveness than beg for permission. Make your teams better right now. Be the positive change by publicly thanking those that are doing good work. Start the dialog in team meetings by bringing up possible issues that can be resolved as a group. It all needs to start somewhere and, in my experience, everyone wants to make things better and will rally around the idea of at least trying new things.

Shake things up and be happier in your teams.


A friend of mine called me up recently to ask me how to get started with programming. I’ve gotten these requests more and more as the demand for programmers rises. I’m going to compile a list of resources to help anyone get started with what I feel are the basis for what anyone who wants to program will need. This list is by no means comprehensive and while this will get you started you should not feel like you can go from knowing nothing to building the next Facebook simply by following this guide. It will, however, give you a solid foundation with which you can build and grow to the point where you could potentially build something like Facebook or Instagram on your own or working with a small team.

Which Language Should I Learn?

This depends entirely on what you are trying to do. Some people want to make their work life more efficient by writing small programs to automate their daily tasks while others may want to create websites and web applications. For the first I suggest Python. It is easy to pick up for beginners, it forces good code formatting, and it can be extended to do a large amount of things including creating large websites and applications (Instagram runs on Django which is a web framework built on Python). If you really want to write web applications or create interactive websites I would recommend learning Ruby on Rails. I have written web applications in both languages and I am far more effective in Rails thanks to their mantra of “Convention over Configuration”. I’ll be writing a post about why I feel Rails is better than Django later. Pick your language based on your goals and read the online books I have linked below. They will help you set up your computer and teach you how to create very simple programs for you to have a good base of understanding for programming.

Great Starters Guides

Code Editor

You’ll need a program to actually write the code. I personally suggest Sublime Text 3. It is free, light-weight, and can edit any type of programming file. It has a lot of neat extensions and themes so you can customize it to fit your needs.

Learn Git

Once you have picked your language of choice, no matter what it is, you’ll want to learn Git. Git is a tool to help you version your project and files. Versioning is similar to saving but gives you specific moments to return to. Let’s say you are working on a Word document. You start writing a lot, hit save, then you write a bunch more but decide you hate all that and want to return to where it was when you hit save initially. You could hit CTRL+Z a bunch but it would be nicer if you could point to a specific version of the file and say “I want to start from there again.” With Git you can do that. You make commits, marking moments in time, with messages about the changes made. If you ever want to go back you can simply rollback to any previous commit undoing your current changes. This is useful when you have a working program and then start to do some complicated work only to find you have totally screwed up the project. Just roll back to when it was working and start again.


While you can use versioning locally for your small projects you really start to see its true power when you make your software available for others to review and help; this is known as open-source software. Create an account on Github and they will guide you in pushing your local git versioned projects into projects that anyone can see and help you with. Don’t be afraid of others seeing what you might consider “bad code”. The point of doing this is so others can help you learn and progress. When you have a larger project others can write features and submit bug fixes for your code as well. Once you have a firm grasp of whatever language you have chosen you can even write code for other open source projects to help them with their features and bugs.


Everyone should learn a little bit of programming just like everyone learns a little bit of math. Obviously we can go very deep into mathematics and we can do the same with programming but everyone should have a grasp of the basics and have a foundation even if you don’t do it professionally. I hope this guide was useful and let me know if you have any questions or concerns in the comments below.


Firebase is a great way to connect applications to a database that will sync data in realtime.  Tying this in with AngularJS allows you to create a single page application that updates dynamically and as data changes without page refreshes.  This allows you to create applications that can give your users access to data the moment it is updated and changed.  They have a great binding called AngularFire that links the two services together nicely.

One thing that I had problems with was filtering data returned by Firebase with the great AngularJS filter method.  Because AngularFire returns a dictionary with methods and elements the AngularJS filter has problems filtering the data correctly.  The AngularJS template rendering can render the data just fine but the filter does not work.  To fix that you’ll need to employ the AngularFire method orderByPriority before your AngularJS filter.  Here is an example.

In my Controller I access the list of stores using Firebase and $firebase.  At this point my $scope has the list of stores with some methods used by AngularFire to update data.  The partial above will render the list just fine but without orderByPriority the search filter would not work.  The orderByPriority converts an object returned by $firebase into an array.  This array will work with any normal AnguarJS filter.

Here is the definition from the API of AngularFire.

The orderByPriority filter is provided by AngularFire to convert an object returned by $firebase into an array. The objects in the array are ordered by priority (as defined in Firebase). Additionally, each object in the array will have a$id property defined on it, which will correspond to the key name for that object.

That’s all there is to it.  I hope this helps someone else figure out this problem as I spent a long time trying to get my filter to work with Firebase objects.

When developing you’ll occasionally need more than one version of Python, Django, etc. for your various projects.  The way to have multiple versions of the same library installed on one machine is to use virtualenv.  Virtualenv creates a virtual environment where you can install a unique version of Python, Django, etc.  This is great for testing and for working on old projects where you need old versions of things.  For example, our old project at work uses Django 1.4 but the new system uses Django 1.6.  I can’t run the 1.4 project with 1.6 because of all the deprecated methods and changed folder structure.  Instead, I create a virtual environment for 1.4 and another for 1.6.  This way I load the Python modules required for one project differently than the other.  In this guide I want to show you how to quickly set up a new virtual environment and install all necessary Python libraries.

The first thing you’ll need to do is install virtualenv.  The quickest way is by using the command [sudo] pip install virtualenv.

Once that’s done you’ll need to create a folder for your virtual environment.  For my Django 1.4 environment I made a local folder called Django1.4 using the command mkdir Django1.4.

Now simply run virtualenv Django1.4.

Activate the virtual environment by running source Django1.4/bin/activate.

And you’re in!  This is running a fresh and clean virtual environment not linked to your other installations.  Now you can install any version of Django and all your other Python libraries and they will always be separate from your main installation or other virtual environments.  Note, do not use sudo in any of your commands as that will install the packages to the main installation and not just your virtual environment.

To stop the virtual environment run the command deactivate from anywhere.

Once you have Django installed and the version of Python that you’d like you’re ready to go.  A good idea is to keep track of what version the packages you’re using is.  Creating a requirements.txt file that contains a formatted list of Python libraries and their versions will make setting up new virtual environments even more painless.  Once you’ve setup and installed all necessary Python libraries to your new virtual environment you can export that list using the command pip freeze > requirements.txt.  This creates a text file containing all installed Python libraries.  When you, or anyone else, needs to install your necessary libraries you can run the command pip install -r requirements.txt.  This reads each line in the file and installs the correct version to that virtual environment.

I hope this helps as I’m sure plenty of people need multiple developing environments for testing and maintaining old code.  We will be using it in the future to see what major changes need to be made from our Python 2.6 code to be Python 3 compatible.  If you have any other tips or tricks with virtualenv please feel free to comment below.

My IDE of choice for developing lately has been Komodo Edit.  It’s lighter than Eclipse and does what I need it to do.  Installing and updating on most OS’s is easy but on my Ubuntu installation I always have to do a few more tricks to make everything work just right.  This post is to help me remember exactly the steps of installing and updating so that I don’t need to Google it every time.

  1. Download the latest version of Komodo Edit
  2. tar xvzf Komodo-Edit-8.5.2-13850-linux-x86.tar.gz Update this to your downloaded version
  3. cd Komodo-Edit-8.5.2-13850-linux-x86
  4. sudo ./install.sh
  5. When prompted for installation location enter /opt/Komodo-Edit-8/
  6. If you already have Komodo Edit installed in that location run sudo rm -r /opt/Komodo-Edit-8/ to uninstall it first.
  7. export PATH="/opt/Komodo-Edit-8/bin:$PATH"
  8. Search for it in your Dash and all should be good.

Hope this helps someone else, I know it will help me.

Recently I tried sending a list through a form using something like <input name="my_list[]" value="some val">.  When this form is submitted all of the inputs with that name are grouped together for easy access.  In Django, one would think you could simply access the list using request.POST['my_list[]'].  This is not the case. Using that command will give you the last value.  Django says this is a feature and to get the list use request.POST.getlist('my_list[]').

Just an FYI and reminder to myself.

Anytime I need to move data or alter our database I get a little bit nervous that something is going to go wrong and crash the database losing all of our data, dropping tables, causing chaos, and so many phone calls.  Our database automatically backs up every so often but right before any major changes I make a quick local copy of the data.  This came in handy just the other day when a table was inadvertently dropped and I had a backup on hand.  Here’s how to do it using console commands.

Making a Backup of a Database

Restoring a Database from a Backup

Make sure the database is created before restoring.

Making a Backup of a Table in a Database

Restoring a Table from a Backup

Make sure the table has been created already and MySQL will know where to put the data.

MySQL error 1449: The user specified as a definer does not exist

To fix this problem use the following command when restoring your database.

If you rename columns you will get some weird results so make sure that the tables are the same before and after the backup. Let me know about experiences or tips you have with backing up and restoring MySQL databases.