Last week marked my fourth year at Qobo. Here are the blog posts that cover my first, second, and third years. And with one more now, I think it’s starting to fall into a trend of crazy years.
Yes, indeed. The last year has been no different. There were all the usual components:
- A tonne of projects! We’ve done more in numbers, complexity, and variety of projects this year, than before.
- The team is growing. And while not everybody stayed, we’ve found some new great people to join the team. Overall, we are more now than we were a year ago. And we’ve also expanded the roles. We have dedicated quality assurance and support people now.
- New office. There is an office story every single year. First we moved the Nicosia office, then we opened a Limassol office, then we opened a London office. And this year we’ve moved the Limassol office to a larger space, as we couldn’t fit all the new people any more.
- Technology. Over the last year we have almost doubled our infrastructure (thanks a lot Amazon AWS). We’ve played with Docker containers. We’ve moved from HipChat to Slack (somewhat a forced move, but it was interesting from the technology perspective, as we have a lot of integrations). And we have grown our Qobrix platform and some of the applications built on top of it significantly (over 160 versions released in a year).
I’ve learned so much, it almost seems that even the last year was a lifetime away. I’ve enjoyed working with everyone on the team, and even with most of the clients (evil grin). It’s unbelievable how much we have accomplished this year.
I also think that the next year will be even more interesting and challenging, as we’ll probably need to shift from the current mostly startup-like operation to a more of a settled and predictable one. Chaos can be very productive, but it’s less so with more people on board. So I’m excited to see what’s gonna happen this year.
Cheers and thanks to everyone who has been around this year!
open-policy-agent/opa is an Open Source general purpose policy agent.
OPA gives you a high-level declarative language to author and enforce policies across your stack.
With OPA, you define rules that govern how your system should behave. These rules exist to answer questions like:
- Can user X call operation Y on resource Z?
- What clusters should workload W be deployed to?
- What tags must be set on resource R before it’s created?
You integrate services with OPA so that these kinds of policy decisions do not have to be hardcoded in your service. Services integrate with OPA by executing queries when policy decisions are needed.
When you query OPA for a policy decision, OPA evaluates the rules and data (which you give it) to produce an answer. The policy decision is sent back as the result of the query.
Martijn Cuppens tweets the link to this code snippet and a screenshot of how the code renders in different browsers. Yup. Each browser produces a different result. The Twitter thread has more examples.
This is yet another example of how CSS and cross-browser compatibility can drive a web developer insane.
laravolt/avatar is a PHP library that helps to avoid those old and boring anonymous face pictures for users who haven’t uploaded or configured their avatar in your application. With library you can use any string – name, email, initials, or anything else you fancy – to generate a dynamic avatar with random color and letters.
php-jsonq provides an easy, yet powerful way to build queries for any JSON data (or PHP data structures for that matter, which are a step away). This has a variety of useful applications – data migration, API response filtering, complex configurations manipulation, and so on, and so forth.
“Why you should stop using product roadmaps and try GIST Planning” is an interesting look at project management. While I don’t GIST is easily implementable in most companies, mostly due to the change resistance, familiarity and tools, I still think it’s an interesting approach that deserves attention.
Metabase is an Open Source business intelligence and analytics tool. It supports a variety of databases and services as sources for data, and provides a number of data querying and processing tools. Have a look at the GitHub repository as well.
And if you want a few alternatives or complimenting tools, I found this list quite useful.
SitePoint runs an extensive guide to the WordPress performance optimization. Not only it goes over the usual points like hosting selection and avoiding unnecessary plugins, but it also provides some insight into the WordPress database management and optimization, web server tweaks, and links to a few handy tools to help with performance of your site.
We’ve been using Semantic Versioning for quite a while at work now. It’s easy to explain and follow, and it provides valuable context to the numerous releases of the projects and components that we are doing on a daily basis.
Turns out, however, that I missed a small, but important part of the standard. All releases in major version 0 are considered to be unstable, so even if they introduce backward compatibility breaking changes, there is no need to increment the major version to 1. Here’s the relevant quote:
Major version zero (0.y.z) is for initial development. Anything may change at any time. The public API should not be considered stable.
If you are relying on the semantic versioning in your projects, make sure to check your dependency management tool, to verify that it handles major version 0 correctly. Gladly, for us, composer does the job:
^ operator behaves very similarly but it sticks closer to semantic versioning, and will always allow non-breaking updates. For example
^1.2.3 is equivalent to
>=1.2.3 <2.0.0 as none of the releases until 2.0 should break backwards compatibility. For pre-1.0 versions it also acts with safety in mind and treats
For the last few years I have been heavily involved in building web applications with the CakePHP framework. Apart from all the usual MVC, ORM, and so on, and so forth, features, I am a big fan of the CakePHP utilities. And among all of them, my long time favorite is the Inflector class.
The Inflector class makes makes word transformations a breeze – camel-casing, snake-casing, plural, singular, and so on – work like a charm at least for the English language. It’s also possible to use the same functionality for other languages, but that would require quite a bit of the linguistic expertise.
I’m a lot happier with my universe now.