Generally speaking, my posts are for people who are already working professionals. However, after a couple of spectacularly bad initial interviews (not even making it to a technical screen), I’m starting to think it may be prudent to offer some advice to the younger set hoping to become working professionals.
Following what’s probably a very predictable course of operational maturity, my team at work started out manually uploading jars onto VMs, maybe with a few simple services, scripts, and setup tricks to keep the manual steps for deploying software to a minimum. As the amount of code we wrote and maintained grew, we started to focus on automating more and more of our code deployments, with an emphasis both on rolling deployments (so there’s no visible downtime to users), and on increasing reliability by reducing the number of steps we could possibly mis-type or forget. Since our code was heavily deployed on AWS anyways, OpsWorks seemed like the perfect setup for us. So far, while it isn’t actually perfect, it’s been a good tool for getting our app deployments and instance configuration more automated, which is what we really needed.
Java 8 introduced a lot of cool features, 1 of the most useful of which was the
stream() method. This nifty little method lets you treat an Iterable as a stream, enabling cool things like lambdas operating over a list. Related to
parallelStream(). This lets you group your stream into smaller streams that are run in, you guessed it, parallel. Specifically, your data is processed in a thread pool the size of the number of cores on your machine, minus the one running your app. That’s a handy piece of information you’re going to want to keep in mind before you start throwing this nifty little call around in your code.
For a while, I worked for a manager that wore a lot of different hats on our team, including that of “product manager.” Sadly, that meant he was often really busy and thus hard to pin down to get a product answer from. He knew that this was an issue, and wanted to get a full-time product manager for our team. At the time, I was thrilled about the idea. Fast forward a few months, and a little reorganization later, and our team now has a dedicated product manager, and I’m regretting my earlier enthusiasm. There seems to be a disconnect between product people and developers, so for any product managers reading this, here’s a few tips to help improve your interactions with developers.
The team I’m on at work currently has a remote developer. He’s very good, but he lives in another country, and is technically a contractor and not a full employee. That means there are restrictions on what he can and can’t have access to or do for us. These limits have started me wondering, at what point is a remote developer’s ability to contribute so limited that it limits their value to the organization as a whole?
We all work with somebody who’s day job appears to be best described with phrase “has and attends meetings.” Think of any product or project managers (there’s a difference between the 2 I’m told, but I couldn’t tell you what that was) at your office. They’re always in meetings, and it’s not at all uncommon for them to insist that you join them. In fact, it seems like the more you work directly with these managers, the more time you spend in meetings. The thing I have a hard time understanding is, if all you’re doing is sitting around in meetings, then at what point are you doing anything valuable for your employer or their software?
Recently, we had a Kinesis consumer back up due to a deployment problem. Sadly, this problem went on for 2 days without us noticing, so we were pretty backed up. Now in theory, we should have been able to catch back up to real-time data sometime later that calendar day. In reality, we fell 2 days behind and it took us 2 days to catch up. That’s not acceptable, and I wanted to document the list of things we tried and how well they worked and to document our process for looking for the bottleneck. Obviously, there’s tons of room for improvement in the code, but there’s also a lot of room for improvement in how we were doing things before, and probably a lot of room for in how we went about trying to fix the issue.
I transferred teams at work recently, and spent about a week trying to get their code running on my laptop so I can do useful development work. This is in addition to trying to wrap my head around the existing codebase and figuring out how to test my changes. It’s not that the code is bad, it’s just getting all the ****ing components hooked up, communicating with each other, and playing nicely together an exercise in impossibility. Coming from a group that ran everything in AWS, going back to managing all the third-party services in a development environment makes me want to flip my desk over and start screaming about what the **** is wrong with everyone.
You’re sitting there at work and word reaches you that your application is misbehaving. What’s the first thing you do? Pull up the logs and see what they say. And this is where you may wish that you had an entire class in school dedicated to the art of writing useful log messages. Good logging is an art, and it’s 1 that most of us don’t learn until we’re stuck trying to diagnose something in the wild with subpar messages to guide us.
I mentioned in a previous blog post that we had used DynamoDB on an internal project at Bronto (my employer, but I don’t speak for them – they have people for that). That project is the Bronto Cantina – which launched to the whole Durham office a couple of weeks ago. It was a pretty neat little application, most of which was written over the course of a couple of days, followed by bits and pieces of cleanup afterwards to get a test setup up and running. Now we’re live, and I wanted to say a few words about it.