What does Agile mean after all?

As you might already know, I work for JustEat, we are a start-up, a very big one, but still a start-up, I work on the Technology Department, I’m a team leader (I try to do my best at being one) and we have many many open positions.

Recently we had a few good developers coming in for an interview, and they all seem quite surprised that we do not adhere to any specific agile methodology.

We do not do SCRUM, we do not do KANBAN, we do not do regular stand-up.
We believe we are better than that. We are Agile to the extreme.

We use a mix of those methodologies, we use HipChat  and public rooms for all our conversations so that everyone can just jump into another team room, ask question or just keep an eye on what people are doing, we use JIRA to keep our workflow public within our company, everyone can go and have a look at each team board, and see what they are working on and what it’s coming up next in their list. imageimage

We also have a weekly report  that goes out every week to everyone and explain what the Tech department has been working on.

We love technology, we live with technology and use a lot of different technologies, we use a Microsoft stack (MVC/.NET/C#/SQL Server) on Amazon AWS, we use Java and DynamoDB for our Search Engine and Hadoop processing, we use Ruby for test and automation, we use Powershell for some throw away scripting, we use Coffeescript/CouchDB for our EPOS system, we use a ton of open source frameworks.

But, (there is always a but) we are also very business oriented, we do not use all those different technologies just because we like them, we do so because we believe that it’s always better to use the right tool for the job.

If you want to know more about our iper agile way of working, do not hesitate to reply to this post.

 

Advertisements

ayende – Challenges: Where is the optimization? – my thought

Few days ago, Ayende posted on his blog a challange.
You can read about it here http://ayende.com/Blog/archive/2010/02/16/challenge-premature-optimization-and-all-of-thathellip.aspx

[…]
In the end the question was:

bus.Send(
new MyBooksRequest{UserId = userId},new MyQueueRequest{UserId = userId},new MyRecommendationsRequest{UserId = userId});

Produces this SQL:

enlisted session in distributed transaction with isolation level: Serializable
SELECT user0_.Id          as Id2_0_, […]FROM   Users user0_
WHERE  user0_.Id = 1 /* @p0 */
SELECT currentlyr0_.[User] as User1_1_, […]FROM   UsersReadingBooks currentlyr0_
       left outer join Books book1_
         on currentlyr0_.Book = book1_.Id
WHERE  currentlyr0_.[User] = 1 /* @p0 */
SELECT queue0_.[User]  as User1_1_, […]FROM   UsersWaitingBooks queue0_
       left outer join Books book1_
         on queue0_.Book = book1_.Id
WHERE  queue0_.[User] = 1 /* @p0 */
SELECT recommenda0_.[User]  as User1_1_,[…]FROM   UsersRecommendedBooks recommenda0_
       left outer join Books book1_
         on recommenda0_.Book = book1_.Id
WHERE  recommenda0_.[User] = 1 /* @p0 */
commit transaction

That seems strange, can you figure out why?
[…]

My first answer was

# re: Challenge: Premature optimization, and all of that… 2/17/2010 12:06 AM simone basso

may be grouping all those queries into the same transaction might cause some more deadlocks?
I was asked to argument about my statement so here I’m.

I wrote a small program using the new Parallel Extensions in .net 4.0 http://blogs.msdn.com/pfxteam/ to simulate a heavily loaded system.
You can download it here http://cid-a117aa5e007a0648.skydrive.live.com/self.aspx/ProgrammingExamples/Alexandria-DeadLock.zip
It contains the script.sql from http://github.com/ayende/alexandria to generate the database

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
image

SET TRANSACTION ISOLATION LEVEL READ COMMITTEDimage

As you can see the problem is with the type of isolation used.

A transaction with Serializable Isolation places a range lock on the data set, preventing other users from updating or inserting rows into the data set until the transaction is complete. You can see that in the first case, the Lock time is quite high, while in the second case it’s zero.

This can have a huge impact on highly scalable applications and especially in web applications that require to often update and write on the same dataset.
I use to work at Bookarmy, where in fact we had a huge database (8+M books records) and a fair amount of users and connection between users/books/authors etc.

Almost immediately after the GOLIVE we had to update out LINQ Data Access Layer to trigger
td.ExecuteCommand(“SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED”);
for the most demanding queries, or split query batches in smaller queries, to reduce the amount of table’s areas locked by every transaction

References:
http://vyaskn.tripod.com/com_isolation_level.htm

 

 

optimize your database performance

I was reading about improving DB performances and saw this interesting post

http://www.milkcarton.com/blog/2009/01/29/Have+You+Reindexed+Your+Database+Lately.aspx

unfortunately the script for SQL 2005 on that post does not work so here it is a working version

USE DatabaseName –Enter the name of the database you want to reindex
DECLARE @TableName varchar(255)
DECLARE TableCursor CURSOR FOR
SELECT table_name FROM information_schema.tables
WHERE table_type = ‘base table’
OPEN TableCursor
FETCH NEXT FROM TableCursor INTO @TableName
WHILE @@FETCH_STATUS = 0
BEGIN
declare @com varchar(200)
SET @com = ‘ALTER INDEX ALL ON ‘ + @TableName + ‘ REORGANIZE’
exec (@com)
print @com
FETCH NEXT FROM TableCursor INTO @TableName
END
CLOSE TableCursor
DEALLOCATE TableCursor