engineering

4 Steps to Improve Velocity and Happiness

4 Steps to Improve Velocity and Happiness

Velocity is the speed with which you're able to deliver value to your customers. While at first glance it might seem that this is a constant factor related to velocity of each engineer and the number of engineers, velocity can in fact increase or decrease for many reasons.

Good engineering teams track their velocity and work to increase it. These four steps helped us identify forces working for and against our velocity, and take actions to encourage the former and reduce the latter. As a bonus, many of the actions we took made our lives easier and reduced the time we had to spend on less interesting work.

1. Track your time.

    No one likes tracking their time. It adds overhead and feels annoying. But it also provides value: you can see where your time goes, and decide whether it is going to the right purposes.

    We all do this naturally to some extent, but we may forget things or misperceive how long we actually spend on a task. So now and then, try tracking your time over an entire day for several days. Record when you start working on each task you do and when you switch to something else. You'll learn something.

Nine Reasons Curiosity Media is a Great Company for Engineers

It's no secret that recruiting good software engineers takes work. Those of us who are trying to do it have probably given a lot of thought to what qualities we want in an engineer, but what about the other perspective — what engineers want from a company? Thinking that way is more helpful and likely to lead to a good match.

To try this theory out, I found an article, Nine Things Developers Want More Than Money, that rang true with my own experience, and I set out to see how our company, Fluencia, stacks up. So while the following assessment may sound like there's some shameless self-promotion going on (there is), it was written in the spirit of investigation: first, to ensure that we are in fact a great place for engineers to work, and second, to work on language for communicating this to candidates.

So how do we do on "Rob’s Criteria for Keeping Your Developers Happy"?

1. Being Set Up to Succeed

This is an easy one, because engineering success is fundamental to the success of our company. Our users expect and deserve a great experience from our products, and compromising on that for any reason just doesn't make sense.

The engineering team partners with our product team to set priorities and schedules. We push hard with our goals, but they're not out of reach, and code quality is built into the schedule. Simply put, shipping unmaintainable, buggy features — no matter how fast — would negate all our hard work and erode the trust our products have built up over the years — so we don't do it!

Big, beautiful monitors and nice laptops are another dimension of being set up to succeed. There's no skimping on tools, if they'll help to get the job done!

2. Having Excellent Management

Chris, our CEO, knows the English-Spanish language-learning domain inside-out.

His talent for problem-solving is legendary. He asks challenging questions, and he wants to be challenged. The first question out of his mouth when addressing a new question or problem is, "What do you think?"

On top of that, he did engineering work for years, so he knows how engineers think — which, personally speaking, was a big factor in choosing to work here. On his own, he scaled SpanishDict into a site capable of serving multiple millions of visitors a month, which means he knows what it takes to do things right.

3. Learning New Things

We never solve the same problem twice. Our team is responsible for two very different projects. One, SpanishDict is a reference website, built for speed, scale, and simplicity of use. The other, Fluencia is a fresh take on solving the age-old problem of language learing via cutting-edge technologies in a responsive single-page app.

Underlying both these endeavors are proven yet fast-evolving technologies such as Node.js, Backbone.js, MongoDB, AWS, and Chef. And as we've learned more about how to use them, we've given talks at local meetups on best practices.

The Node ecosystem in particular moves at the speed of light. We're always on the lookout for new modules and libraries to help us out and enable new features. And as we move into the middle of 2014, we're tackling a new tough challenge: voice recognition.

4. Exercising Creativity and Solving the Right Kind of Problems

As long as language has existed, people have wanted to easily and quickly learn new languages — and it's never been possible. That's the ultimate problem we're out to solve.

Along the way, we're solving lots of particular, individual interesting problems. One of the reasons Fluencia works so well is that it provides tailored feedback when users answer questions incorrectly. Our feedback module applies heuristics that allow it to recognize many kinds of mistakes, determine which rules of the language the user broke and what context they were broken in, and choose a few particular things to emphasize for each response. It's a thorny problem, and we're far from done solving it completely.

In addition, we get to solve interesting problems of scale as our user base continues to grow, and we collect more and more data about how our users use our products. We are in the business of solving users' problems, sometimes before they even know what they are — and by analzying data, we can do that.

The boring, wrong kinds of problems that Rob mentions in his article, such as fixing bugs, patching broken code, and supporting legacy systems, are minimized since we promote code quality and responsibility. The less time we spend on that, the better.

5. Having a Voice

Chris sits about six feet away from the engineering team. He wants to hear from us, whether at our quick daily standups, or via chat and email, or any other way. When something isn't working right — a process, a feature — he's all ears. He takes suggestions and ideas seriously.

The same goes for the rest of the team. Content, marketing: they all talk to and listen to the engineers. On a small, dedicated team, every voice should be heard, because good ideas can come from anywhere.

6. Being Recognized for Hard Work

Our company has a tradition of giving each other cumplidos at our weekly team meetings. Cumplidos can be translated as "compliments", and it can also mean something that is accomplished or fulfilled (as in misión cumplida, or "mission accomplished"). We recognize and cheer each other on for reaching goals, working together, and going above and beyond.

Our greatest recognition may come from our users. At our weekly team meetings, we share a sample of it as well. For example:

Your program is definitely working for me. It's fun, educational and very effective. It's like having my own private tutor...but better. Please, keep up the good work! Thank you for such an excellent method. - Michael

Positive user feedback such as this is truly gratifying!

7. Building Something that Matters

Our company is solving a fundamental problem of communication for SpanishDict's 9 million unique visitors per month and Fluencia's 150K+ users. You don't have to look any further than the feedback to know how meaningful it is to them. Hearing responses like the one above, week after week, helps us to keep in mind the value of the work we do.

Whether it's allowing loved ones to communicate, making it easier to get a job and earn a living, or facilitating travel, we are focused on breaking down the barriers to communication. Ultimately, we're making the world a better place.

8. Building Software without an Act of Congress

We spend as much time coding new features as possible. And we strive to get our new hires and interns writing code for production use as soon as we can. Barriers to building software are something we work to remove, not erect!

Instead of acts of Congress, we discuss new features at meetings every other week, ensuring we understand what the feature includes and what the user experience will be like. We generate a rough estimate of how much effort it will take. And that's it — it goes into the priority queue, and once a developer gets to it, they start to work on it, and see it through to completion and deployment.

We value code quality, so we have extensive automated testing, and all code is reviewed before being merged. Far from being a barrier, this practice lets us move quickly by preventing regression bugs and giving us confidence that our features work as expected. That frees us up to work on — you guessed it — even more new features.

9. Having Few Legacy Constraints

Our backend architectures use Node.js, which didn't even exist until a few years ago, and is now being widely adopted — in fact, by the time you finish this post, another well-known tech company will probably have started using it. Fluencia's front-end uses Backbone.js, which is also only a few years old.

As a rule of thumb, we choose the best tool for the job. We defer upgrading for the sake of it, but when we start working on a new feature that touches old code, we determine what it will take to upgrade, and we make it happen.

So even though SpanishDict has been around since 1999, a very long time by internet standards, nearly all of our codebase is very recent.

All in all, I think Fluenca does pretty well when it comes to Nine Things Developers Want More Than Money. What do you think?

If you need more convincing, here are some posts by interns from the summers of 2013 and 2012 about their experiences. We enjoyed working with them, and I think they enjoyed working with us too!

Intern Experiences: Erin

Erin.png

 My Summer Working on SpanishDict and Fluencia

My name is Erin Taylor, and I am going in to my senior year at Carnegie Mellon University, studying Mathematics and Linguistics. I worked as a Software Engineering intern with SpanishDict and Fluencia this past summer. 

Over the past three months, I worked on automating the feedback that is provided to
users of Fluencia, to give real time explanations for mistakes that are made throughout their lessons. This project was especially interesting, because of the crossover between technology and language. I found it very rewarding to be able to work with a team of technology experts, as well as a team of language experts, and bring those two fields together to improve the overall user experience.

I also liked the data-centered approach that was taken. Part of what has drawn me to linguistics is that I enjoy taking apart the patterns within language. Being able to draw on the resources of such a well established online reference as SpanishDict was key to the task of automating feedback for users. I was also able to see real users interacting with the product, and aggregate all the user inputs to be able to see how best feedback could be improved at any given step.

One of my favorite parts about working at SpanishDict and Fluencia was the freedom that I was given to define my work. I found that all team members were available for discussion and to share their expertise, but on the whole I was free to experiment with my project. The open discussion and freedom to try new things within the work environment made for an overall great learning experience, a very productive summer, and a lot of fun!

 

Intern Experiences: Maria

My name is Maria, and I’m nearing the end of my summer internship here at SpanishDict. I’m studying Computer Science and Linguistics at Carnegie Mellon, so a tech company that specializes in language has been a great fit for me. Before starting here, I didn’t have much of an idea of what things would be like, but the experience has been better than I could have expected.

I came in with two other interns, Hari and Zach, and from day one we felt extremely welcome in the office and were treated as real members of the team. I think it can be difficult for students today to find internships that are both challenging and relevant to their interests, but the SpanishDict team has done a great job of fulfilling both of these needs. We were each given a project that was suited to our individual interests, which for me meant natural language processing research.

I had a decent background in Linguistics and a basic understanding of some machine learning algorithms coming into the summer, so I was excited to get to further explore the strategies and applications of NLP. I got to spend time learning about the Natural Language Toolkit, which is a great NLP library for Python. I also did quite a bit of research into the world of linguistic data, and it quickly became apparent that even the most basic types of NLP may not be as solved as we might think. While I do not have a finished product coming out of this project, I’ve had the chance to see some of the amazing things that can be done with language technology.

After finishing my NLP research, I moved into the world of web programming, which I had only barely touched on in the past. If you had asked me before this summer if I wanted to be doing web programming, I probably would have told you no. It seemed like such a limited technology to me, but now I realize that’s only because I had no idea what kinds of things could be done with web applications. SpanishDict had me working with some of the most cutting-edge technologies such as audio recording within the browser, drag-and-drop interfaces, and icon fonts as replacements for images. Now that I’ve seen what kinds of things can be done with only HTML, CSS, and JavaScript, I’m excited to see how the web experience becomes more interactive and eye-catching over the next few years and to have a chance to potentially be a part of that.

In addition to learning so many new technologies this summer, I’ve been lucky to be a part of such a motivated and engaging team. When I first saw how small the team was, the impressive numbers of how many people use the site seemed unbelievable. However, after spending a few months hearing about everyone’s hard work and creative ideas, it’s easy to see how the site is so successful. Everyone at SpanishDict holds their own work to such high standards, and bringing a quality experience to the users is the first priority. At the same time, there’s still a fun and laid-back atmosphere in the office, and I’ve had an awesome time getting to know my coworkers both at work and while exploring DC during our group events.

Overall, this has been quite an eye-opening summer! I’m grateful to have had the chance to work on a product that will help so many people learn a foreign language. My skills as an engineer have definitely improved, and I now have a much better idea of how large code bases are maintained and organized in the real world, which is something my coursework has not exposed me to. Finally, working in a small team has taught me so much in addition to the engineering side of things, such as advertising strategies and search engine optimization. This has been a rewarding experience for me, and I’m excited to see the great things that will come from SpanishDict in the future! 

Intern Experiences: Zach

My name is Zach Cross, and I am currently an intern at SpanishDict. In a few days, I will be returning to Chapel Hill, North Carolina to finish my last year of undergrad at UNC, where I study Computer Science. The goal of this post is to reflect on my experience at SpanishDict, both for my own benefit and for communicating what it’s like to work at this great company.

I started here with two other interns (Hari Ganesan and Maria Bajzek) in late May. Moving from rural North Carolina to Washington, DC was an interesting transition, but I quickly settled into a comfort zone both at work and in the city. We have a company culture that creates a low stress, personal atmosphere that encourages productivity and helps us achieve our ambitious goals. From day one, I have learned an increasing amount about the company, our product, and the people here. In the context of engineering, I have benefited from the torrent of knowledge that is Ryan Roemer, our Director of Engineering. I have learned not only as a direct result of my project work, but also in asking Ryan questions about his own work. Additionally, I have learned about our business model through our weekly team meetings and in everyday conversations with other members of the team.

My primary project relates to both managing changes to the schema of our database in response to regular changes to the website (especially with the addition of our Node.js API) and maintaining the quality of our content. The fundamental problem I sought out to solve was managing database state (both schema and data) in a flexible, controlled manner that still allowed for sweeping changes. The secondary problem was creating a better interface to our database for content maintainers.

To solve this problem, I used the Django web framework with the Django app South for data and schema migrations. Because I wasn’t working with a clean slate – that is, the database already existed – I relied on Django’s database introspection tools and some manual (and scripted) tweaks to model our data. Several iterations of work later, a handy schema diff tool confirmed that my Django models captured the schema of the current database properly. From there, I modified Django’s built-in admin web interface to suit our needs. We now have a number of schema and data migrations in the teens, in response to needs for new features and data quality control. That is the long and short of it, but I should say that using Django’s ORM (object relational mapper) to programmatically handle data migrations was much more convenient than sanitizing and validating huge batches of SQL commands.

Having very much simplified my primary project in this post, I do want to elaborate on one particular set of migrations I worked on. We are a data- driven company, with tons of log data at both the application and server levels. I wrote a few data and schema migrations to facilitate the viewing of user query data via the admin web interface I mentioned. In addition, I wrote a few normalizations for our Hadoop MapReduce jobs that boiled down our logs into feasible quantities. The exposure to big data (something that once seemed nebulous) was a great learning opportunity, although it was pretty easy given our in-house tools for big data analytics. Now, we have the capability for team members who aren’t developers to add and make changes to our site content. Most importantly, we can react to what our users are searching for and better serve their needs. The web interface reflecting this analytics data was also constructed in such a way that progress is trackable without hassle.

As I wrapped up my primary project, I asked Chris (our CEO and a fellow developer) if there was more project work that needed to be done. He gave me two terrific projects related to a new product of ours… but I can’t go into detail on that just yet! The point is that there is always exciting work to do at SpanishDict, that we are continually seeking to improve our existing and new products. This sense of zero stagnation is probably one of the best parts of working here. New features are being created every day, and old ones are being improved. Not to mention, there is no shortage of ideas between our brilliant team members!

For anyone considering working here, whether or not you are a developer, if you are looking for exciting work and great co-workers, look no further! We have great people, great products, and great purpose! Y para los que hablan español, o quieren aprender, tengo que decir que esta oficina está llena de gente cosmopolita que traen todo tipo de experiencias internacionales y culturales al equipo. ¡Hay mucho que compartir y aprender!

And for the developer-types considering working at SpanishDict, know that there is an abundance of challenging (and therefore fun) problems to solve. That and very intelligent and creative coworkers who will no doubt be a source of knowledge and motivation. To end this post, I’ll throw some technology buzzwords to capture some of what I’ve seen and learned about (in varying degrees) at work:

Django, Python, Boto, MySQL, PHP, MrJob, Node.js, CoffeeScript, Loggly, Scout, NoSQL, MongoDB