Distributed Programming Models In Algorithm Design