building complex applications