All sorts of awesome - use a kinect to interact with a Kaizen board. Amazing.
All sorts of awesome - use a kinect to interact with a Kaizen board. Amazing.
After a longer than planned hiatus, here is the second part of my building enterprise web applications blog post.
One of the aspects of django that I really liked when I first came to it was the ability to plug in apps that gave you discretepieces of functionality. Need your users to have an avatar? there is an app for that. You then have the ability to override the templates,wrap the views and even subclass the models to customise the app's functionality without having to branch the code of the app. This gives yougreat flexibility when trying to build new applications. However, as with any selection of open source code, there are some stars and some dead-ends. I've tried to list the apps that I've recently used on a large project to give you a guide:
Since January of this year I've been engaged in building what I guess many would call an enterprise web application in Django. I use the term enterprise in the sense that the project I've been tasked with building is large in nature of importance to the organisation and also in parts quite complex. It's been a very useful and educational experience, one which I would gladly repeat in Django. I'm going to break this down into three posts I think, the first being about some of our toolchain and possible improvements on it, second on django apps we used and some measure of how good they are and finally some advice on how to run similar projects and some pitfalls we experienced.
Toolchain
We developed on linux desktop machines in a variety of emacs, vim & nano. I know a bit hardcore, but we did make use of various plugins to help us, including the excellent vimmate plugins. Each developer ran a local instance of the django app, using the default server and sqlite3 for speed. We used virtualenv and pip requirement files to manage any external dependencies and used fabric to automate sections of the app deployment. We also worked with the internal systems team to move all of the Linux depenencies to Puppet as well, which will eventually give us a completely automatic build. We're not there yet as we still need to get postgresql database creation online and stable within our fabric / puppet coupling.
We made use of existing subversion hosting internally, we used tagging for releases, keeping trunk always in a runnable, non-broken state. We have a suite of tests for the django apps we wrote, written both as unit tests and functional tests where appropriate. We haven't got any in the browser tests using say selenium, but I'll cover that in the final post.
We used postgresql which for our domain is great, we don't do anything particularly hard with it (like GIS, real-time updates, etc) so we haven't had to tune it nor look at connection pooling for example. I've broken out our fabric script to be able to be able to setup our database on any host so that as the system grows the sysadmin team can migrate to a dedicated db server.
Aside from commenting code, we've used sphinx to create both enduser documentation and internal developer guides as we wanted to document our api and some other aspects of the system in a way that will be easy to pick up. For end-user documentation we took a demand led approach starting with cheatsheets and quickstart guides and fleshing out where questions come up.
Issues
Developing on Linux when you can't customise your working environment is a pain. A lesson I should of learnt early and acted on, was to lock down our target deployment environment (currently Fedora 12, and then RHEL 6 when it comes out of beta) so we could have set up a continous integration system such as Hudson. We have a test suite that is regularly run but could do with being automated. The ability and the need to be able to build a new instance of the system to test say a sandbox system integration cropped up repeatedly, slowing us down as we have to request a new VM to be built. What I'd do in future is maybe get a machine built using something like Ubuntu private cloud, that we could have had control over so as to remove a dependency on sysadmin support.
From a project management point of view we used basecamp with our UX designers, Trac with internal developers & RT with IT support desk. I'd say that basecamp worked well, but some way of digitally commenting on wireframes would have been really handy. They were produced in Axure which did a great job of automating documentation creation for the front-end developers.
Lessons learnt
Next time: django apps - conventions, finding them & measuring quality.
Legacy is a very loaded word in digital; any project or piece of code, branding, visual design can be described as legacy even though it may still be fit for purpose and do what was originally asked of it. What is and isn't legacy is purely a point of view, it can be that everyone holds the same point of view but it is still a qualitative measure of a website or system. There is no discrete definition of what is and isn't legacy. A billing system written in Bash maybe in the minds of most a legacy system or a banking system written in COBOL, but then some may say that a php site built only 12 months ago is legacy because it doesn't meet the requirements of today.
It's most loaded use is by salespeople and people selling a particular new technology. Phrases such as "integrates with legacy systems", "increase your ROI on legacy systems", all ring alarm bells in my mind as there is an instant assumption that legacy equals crap. That is not always the case and in many respects you must understand the full business requirements of system to understand it. There are however related issues which can be indicative of an issue with a system, code rot, technical debt and the associated passive rot and active rot. These all describe the degrading of a program or piece of code that through environmental changes or "a death of a thousand cuts", leads to a reduced functionality and a movement away from it's core use.
In an ideal world all projects - no matter how small or big - would come with extensive documentation (project aims, use cases, wireframes, planing docs) however we don't live or work in an ideal world. We live in a commercially driven reality, whether you're billing by the day, responsible for a large business change project or just trying to get something done in an evening. It is about achieving balance between your goals within your constraints. And this by it's very nature does lead in to the creation of legacy projects; they are epoch specific, a creature and a composition of their time. Imagine trying to build a website that has to last 50 years - how would you start it? how could you build it?
Legacy I feel is not a bad word, it's the emotional connotations we place upon systems we label with it that are our problems, our own internal beliefs that new is better (which in many cases it is!) without understanding the mental blocks that puts on us as programmers or designers as we work with the system / project.
In a nutshell: be kind to the decisions of those who have gone before you; who knows what your code will look like in the future.
A recurring theme in many of the offices / companies I've been involved in has been the quality and atmosphere of the offices that I've worked in.
Some people (and companies) don't pay too much attention to them, opting for the cheapest / simplest choice at time of need, which I believe is a classic false economy. When working with online projects, you're dealing with a wide range of skill sets and problems; some of which are creative fluffy ones and some that are hard crunchy ones. These both require different types of people and different types of environments. Some things are a given though and for the benefit of anyone building a creative online office space I give you a brief list of key performance indicators to get right:
In short, as others have said, "Talent makes capital dance." If you want to retain talent, you better make sure they can dance. For more inspiration:
It's been a while (note: years...) since I last tried to blog / publish my thoughts anywhere. However, there have been a number of things that have itched me to actually blog about or at least write about them over the last couple of months. So, over the next couple of time periods I will periodically post something of interest to me, probably digital, probably related to something technical or political, who knows.
It's an adventure.