Skip to content

CODETUNES

This is Codetunes, a blog by Monterail, an offshore Ruby on Rails development agency.

Posts authored by Bartosz Pietrzak

Why we love paying for Trello

Trello recently launched an early access of „Business Class” (if you don’t have it yet, you can apply here).

The wording is perfect – little wink to the airline industry seems far better than „premium”, „paid ”or „pro plan”.

We use Trello on a daily basis throughout every section of the company – from IT management, administration and accounting to keeping track of our digital library and book requests. Yet there was a little fear in the back of my head: we rely on it so much but we don’t pay for it.

Let your ideas grow

Making complex ideas real can be tough for various reasons. It’s safe to say that most of them aren’t getting out of our heads – assuming that just speaking about them doesn’t count. Simple actions can lead to greater outcomes and I’m going to share a bit of my experiments in that matter.

Culture

An excerpt from our internal documents and our job offer template. One of our goals for 2013 is to make Monterail one of the best places to work — we put efforts into this constantly but we want to organise stuff and make it clear to everyone, both inside and outside.

We try to make sure that every member of our team fits and agrees with those values.

  • Teamwork. We believe it works better.
  • Communication. One of our main concerns.
  • “Good job.” We want you to give us a reason to hear it often.
  • Knowledge sharing. Every week, without unnecessary prolongation.
  • Decisions. We like to make them as quick as possible.
  • Personality over the system. We don’t have a dress code or redundant bureaucracy.
  • Learning. We love it. We try new technologies and always listen to each other when it comes to choosing the best one.
  • Office. While you can work remotely from time to time, we believe in synergy and social value of being in one place.
  • Wrocław. It’s a beautiful city. And we’re organizing local meet.js events.

Improving offshore communications: going dark – solved!

This post about us going dark during business hours of our US-based clients is a mixture of two issues I personally enjoy heavily: improving customer support in our offshore rails development agency and utilising SaaS tools to provide more „international” experience.

Problem

One of the most painful parts of working as/with an offshore company is fighting with the timezone difference. It can be neutralised with a good process – having frequent status update calls, using proper PM tools and organising work in, for example, weekly sprints.

But, as usual, this stuff doesn’t matter much when there’s a crisis: with recent outages like the ones caused by Sandy hurricane – nothing listed above can help. There are just times when a client has to get in touch with the provider. What should happen if usual (Skype, email) ways fail?

Resolution

This is obvious for local cooperations: grab a phone and dial someone. Everyone who received an email from us should have our +48 phone numbers, and while the cost is quite manageable when contacting from inside of the EU, it can get quite expensive on the US <-> Poland line.

I had set up a US-based toll free number for our long-term US-based clients to contact us in cases of emergency. There are couple ways to do this – we went with Grasshopper. It was as simple as registering and contacting their support to launch international number. It’s $12/month for a number and a varying rate for incoming calls, but this cost compared to what losses could be caused by us going completely dark for our customers could be, is like nothing.

I forwarded the number to my cell phone (which is always with me). There, it’s done. Then it was a matter of communicating this to our clients with a huge disclaimer saying it’s for critical purposes – and guess what? They did realise it from the very beginning and so far are very reasonable about it.

Profits

  • we can handle emergencies better
  • our services are getting more of the local (or international) sense
  • our clients can be less worried about not being able to contact us during their peak hours

There are, of course, other ways to handle this kind of stuff – SLAs and such, but it’s a different matter. For us, it’s another small milestone achieved.

Szymon teaching Human-Computer Interaction class at the University of Wrocław

Szymon Boniecki who is responsible for a lot of IxD and UX work at Monterail has started lecturing at the University of Wrocław on the matters of Human-Computer interaction.

It’s no secret that a lot of Szymon’s background in this area of expertise comes from working on projects for our clients because HCI is the root of User Experience Design. Majority of Monterail’s work revolves around the topic since every little customer-oriented service we’ve built is an interface.

We believe that designing well crafted interfaces is crucial to every project and I’m glad that experience and skills we acquired at the company can be shared with students of the UWr (practical knowledge, right?).

Lectures are open and happen on Tuesdays at 10:15 AM for those of you based in Wrocław.

Great explanation of database scaling issues

Why is it hard to scale a database, in layman’s terms?

One of the best questions/answers I saw recently on Quora – explanation of database scaling issues in an ELI5 manner.

We’re asked by our potential clients quite often about scaling of services they want to build  - scaling the database is one of the issues and the Quora thread shows nicely how there’s no simple answer to that question.

Jobs: Centrum Cyfrowe

Our client, Centrum Cyfrowe, a Warsaw-based NGO, is looking for a Python developer (though experience with Ruby is a plus) to help them work on, among others, a crowdsourcing project OtwarteZabytki.pl that we built for them.

More information can be found on their Facebook page and in the official press info.

We’ve been working on otwartezabytki.pl with Centrum Cyfrowe for quite some time and we can wholeheartedly say that their team consists of passionate and interesting people.  The code is open-sourced, by the way: https://github.com/monterail/otwartezabytki - and the job offer includes working with external contractors, one of which is Monterail.

A digital watercooler – easiest way to improve communication inside your team

I have always been struggling with the goal of constantly improving the communication inside our development team. We always followed the idea that team is always more effective than any number of individuals. Since the team has grown to 15+ people and a few of us are in different physical locations throughout Poland, we had to find a way to communicate and share knowledge effectively.

We have tried couple different options:

  • Yammer – enterprise-focused twitter clone. Sluggy, overbloated and not effective for us at all – you don’t want to use a tool that you have to remember about and you find it hard to use!
  • Campfire – 1st choice for people that find IRC not being up to the modern web. A lot of ways to integrate great tools. A lot of great mobile and desktop clients. We used it for over a year and it played well – but it’s a massive distraction generator. We’re using it right now mostly to get notifications about git commits being pushed to our repository.
  • IRC – freenode or grove.io, every option had same problems as Campfire – you don’t want to get distracted by seeing an message and not knowing whether it’s important or not.
  • Jabber group chat – yes, we tried even that one. I won’t comment it.

Thanks, Captain Obvious!

For couple months we’ve been using Facebook groups to share links (and funny pictures, yeah).
Stuff that’s not important to making your job done. It’s a tool that you don’t have to remember about – basically every member of our team uses Facebook, and even ones that weren’t before, have to – simply because we’re building software for / integrated with the Facebook platform (not exclusively, of course, but we still do a lot of it).
We use it to share some cool hacks, tools that improve our workflow, interesting gems, backbone.js libraries, design resources and even to remind about using the water filter in a polite way.
It’s great because it doesn’t break your workflow. It’s easy to use. You don’t have to remember about it – you’re probably using Facebook in your spare time anyway. Think of it as a digital watercooler – a place where people meet to get a few minutes of rest and have a chit-chat – simply because everyone drinks water. And if you’re the guy that brings his own water to work (or do not use Facebook for whatever reasons), you are aware that you’re missing some of the social goodness. And it’s a water cooler that you can bring home along with the people around it. And access it from your iPad. And Android device. And a feature phone.

Important is important!

Don’t get me wrong. We still use an group email to share updates about the office issues, absences etc. We use jabber and email (not mentioning project management tools) to communicate about day to day work. But in this case, when we get an email or an IM, we know it’s the important stuff – noise separated, achievement unlocked.

Backbone.js, Rails 3 and asynchronous interfaces


Backbone.js and RailsCurrently at Monterail we’re building a frontend-heavy app. With a lot of cool stuff. Like preloading data for daily views so that you won’t have to wait for every surrounding day to load. Many, many interactive elements that should be really interactive – not in an oldschool, ajax “spinner” way. And a lot of other stuff we shouldn’t talk about yet.

We decided to put more emphasis on Backbone.js with Rails and build most of the app with this combination.

Below you can find some of our findings on the topic of making those two speak to each other in a nice manner.

Asset pipeline

Really makes things easier. Organizing your JS code before it meant a lot of things: handling dependencies, minifying & compressing the code, organizing it into a lot of different files and building connections between them. With asset pipeline and it’s awesome “require” directive, you can forget about handling it manually. You just create the structure in app/assets/javascripts. Or app/assets/javascripts/backbone. Your choice. You can have many different files in whatever directories you like – in the end you’ll get one (or more, if you decide to) JS file that has everything your webapp need.

Don’t forget to:

  • gzip your JS/css assets
  • minify them!

Rails-backbone gem

Also makes things easier. It puts backbone.js (& underscore.js) library code into your asset pipeline. It gives you some great generators to get started if you don’t know where to start. Definitely worth including in your Gemfile.

http://rubygems.org/gems/rails-backbone

Coffeescript & underscore.js

Obviously. It makes Javascript code feel fresh. You can fold, iterate and do a lot of stuff. Be sure to check out underscore.js docs. And coffescript docs, of course, but I bet you know it already.

“V” in MVC done right

Views are classes. You handle logic inside them using the hardcore code, which is receiving so much hate in Rails views. They can have many methods, they do not have to render a single “action”. And templates are templates – and nothing else. There is a lot of discussion recently on the matter of Views/Templates in Rails, but you can start implementing it right away. Go and try it. You’ll fall in love.

You have many options for templates – eco, Handlebars.js, {{ mustache }}, but we recommend haml_coffee_assets. It gives you the HAML you (probably) already know with the ability to use coffeescript within it.

Single-page app

Yes. You will use Rails to render only the core view of the application. Of course, you will have to handle all things around the core of your app.

For example, you should probably leave out:

  • authentication logic: sign up / in, reset password
  • steps necessary to use the app: billing pages
But, other than that, you can use the views rendered in JS. What does that mean?
  • if they do not include any dynamic data, they are lightning fast
  • if they include dynamic data, you can preload it and they still will be lightning fast
Backbone comes with it’s own router. You can utilise pushState without any effort. How cool is that?

Asynchronous interface

Since you’ll be doing most of the association/validation work in background, you don’t have to worry too much about server responses. It’s the same with rendering elements: you’ll be doing it in JS, not Rails. You don’t have to wait for the request to return the rendered element to actually display them. If you create something, the UI should respond right away and the ajax request can persist the data with it’s own pace.

You should, however, prepare a global “something went wrong, reload the page” request rescuer – in case of network outages, backend app failures and so on. But it’s way easier to manage.

API

You get it for free. It doesn’t have to be public, but if you decide to, it’s a matter of adding OAuth as the way of authenticating requests and it’s done. (Or you could go with http basic auth, which is obviously bad for a lot of reasons).

With smart caching (give redis-store a try), you’ll save tons of server power. You know, relating to the old ruby saying, “views are most resource-consuming”.

Conclusion

There are, obviously, downsides, which I’ll cover in future (I silently hope that there won’t be any reason to do that). And topics I haven’t covered. I’m curious about other stacks and ways of doing things. Share in the comments or ping me on Twitter!

wroc_love.rb

wroc_love.rb is a „Fresh Ruby-oriented conference in Wrocław, Poland” that happens on 10-11 March 2012.

We’re proud to announce that our team got involved in co-organizing the event and one of the outcomes is the launch of the new website – go check it out!

One of the goals of the conference is to supply some solid topics that, we hope, will result in long and red hot discussions.

Don’t forget to follow the twitter account, like the facebook page, follow the tumblr blog and submit a paper proposal - if you have something interesting to say!