395 karma · joined December 17, 2010
...and a shameless plug for my Django bi-weekly
Django Round-up: http://eepurl.com/yZh21 (Archive: http://us2.campaign-archive1.com/home/?u=24fce4628ba1d5814de...)
Jacob Kaplan-Moss has a good talk on licensing here, http://www.youtube.com/watch?v=vhuF0oalOi8
The environ trick is nice, and while it makes it harder to shoot yourself in the foot, it doesn't prevent it.
If the price is holding you (or anyone else) back, we're happy to refund your money if you don't find them worthwhile after watching (we'll have a similar guarantee on the site shortly).
Even if you use environment variables, you need them stored somewhere (a secrets.py file, a .env file, a upstart script) so they get onto the machine at startup. At the moment we're kicking around GPG encrypting the data and only decrypting it on the machines that need it.
* https://github.com/lincolnloop/django-best-practices/issues/... * https://github.com/lincolnloop/django-best-practices/issues/...
If you think of any more, feel free to file your own.
Our company does many of the same things, but in the end, we're still tied to the billable hour. I talked about it briefly here: http://lincolnloop.com/blog/2012/may/31/lincoln-loop-everyon...
The only reason you leave is because you think you could do better or make more money. As it stands, people here would rather see Lincoln Loop do better and make more money (which directly benefits them) than try to start their own company.
It isn't a project management tool (lots of good ones already exist), but it is a great discussion tool. Our remote team is closer together because of it.
If you try it out, we'd love to hear your thoughts, feedback@gingerhq.com.
Any important discussions happen in Ginger (https://gingerhq.com) so people can participate asynchronously (disclaimer: its a product we built).
Once a week we have an optional staff meeting that happens in Google Hangout.
For the tech side, we rely heavily on GitHub and sometimes Pivotal Tracker.
That being said, after the initial page load, almost everything happens without a page refresh or full page load. You see new messages (with favicon notification), votes, unread counts, etc. all in real-time. I think Ginger would feel a lot klunkier without the real-time bits.
1. Initial page load dumps in as much data as possible to get things started.
2. All writes go through the Django API (we just look for a success/fail response).
3. All new/real-time data gets pushed to the client via socket.io. This includes data that you yourself created.
#1 is kind of a given, but #2 & #3 are more personal preference/app-specific I think.
We could have done #2 through socket.io, but as noted in the post, Python is our primary language and we wanted to push as much of the logic to it as we could.
At first we had content creators reading responses from the API with all other team members getting their updates from socket.io. This was problematic because creators would get content twice (once over the update channel for the team and once from the API). It resulted in some strange race conditions and a lot of "have I already received this message?" code. In the end, it was easiest for us to just always defer to the data from the socket (which was faster as well).