For the last few days, I’ve been out of my usual C++ cocoon and working, in stead, on a web app to help me better organize my projects and – more especially – help me better track them.
The way I work is very close to an agile practice called “Scrum” (you might have heard of it: it’s probably the most popular agile methodology Out There) with the addition of Kanbans. There are just a few things in my development cycle that aren’t as well-suited to scrum as I would like them to be – most notably the release cycle.
For the release cycle of any given product, whether it be Funky, Arachnida, Yara, or any of the other products I work on, there are a few steps that are always the same and that aren’t necessarily linked specifically to user stories, use-cases, etc.
So, now i’m working in PHP to build me a web app, called Ginger, to handle this development cycle.
I’m usually not really into GUIs: the only GUI development I do regularly is in Qt. Though I certainly have some PHP under my belt already (not nearly the 20000+ hours of C++ I have behind me, but still…) I spent most of that time on the behind-the-scenes stuff. Now, I have mainly interface stuff to do – and I’m having fun!
Once I set up my use-cases and my database schema, the rest is really a question of setting up the views for my different use-cases. So basically it’s a code-load into browser-code cycle. At fifteen to thirty minutes per feature, this is going really fast – and I still have time to do other things (like preparing the next release for Funky, which doesn’t involve much C++ at the stage it’s in right now either).
I’m using Symfony to develop Ginger and, because I like it, I’ll be using it for a few other web apps as well (I have another web app in the pipe, waiting for approval before I get started on it). I like the way the model is set up, using object-relational mappings to access the database, allowing for code like this:
1 2 3
$c = new Criteria; $c->add(SprintPeer::ID, $sf_request->getParameter('id')); $sprint = SprintPeer::doSelectOne($c);
which is all you need to get a sprint from the database. There’s no SQL involved.
Hmm.. I should take a look to see whether that would be possible in C++ 🙂