У меня опыт небольшой. Python, Django, Flask, и по большей части - на oDesk. По моему мнению, самое что ни на есть важное - это: 1) выбор адекватных заказчиков, способных точно объяснить, что им надо, и желательно - технически компетентных; 2) Грамотное общение с ними. На всякое предложение о работе подписывается много людей. Чтобы выделиться среди этой толпы, необходимо потратить определённое время и силы. Внимательно прочесть предложение, подумать над ним и сформулировать в ответном письме вкратце:
- Ваш опыт, пусть и кратко, относительно данного проекта.
- Ваше представление о том, как следует реализовать этот проект (вкратце; но можно двумя словами, но желательно - обоснованно, упомянуть о том, что вот такую-то фичу вы реализуете с помощью MongoDB для пущей скорости). Пустословия и популизма не надо.
- Предполагаемые сроки. Я их обычно завышаю раза в два. Это позволяет решить задачу с запасом и устранить возможные баги, глюки и т.п. Гораздо лучше, чем обнаружить потом, что времени катастрофически не хватает.
Очень хорошо, если Вы сразу напишете ещё и некоторые рацпредложения. Вежливо и корректно, конечно.
Короче говоря, необходимо 1) найти те проекты, в которые стоит вникать и разбираться; 2) вникнуть и разобраться так, чтобы заказчик понял: Вы - компетентный специалист, работаете на совесть, сделаете обещанное и качественно. По крайней мере, очень постараетесь. Если с самого начала тон общения построен именно так, если Вы задали уровень и поддерживаете его, то в случае возможных проблем, неувязок, нестыковок, как правило, люди относятся с пониманием.
Это популярная проблема, все пытаются с ней бороться, придумывают разные инструменты, библиотеки и прочее. Но скажу, что при хорошей архитектуре вложенность функций редко переваливает за 2 штуки - а это уже никакой не `хэл`. Ну вот посмотрите на метод в котором у вас этот самый `хэл`. Это же явное нарушение SOLID - один метод обрабатывает данные, куда-то их посылает, ждет в коллбэке ответ, с ним что-то делает, потом снова вызывает другую асинхронную функцию и опять ждет ответ, и так несколько раз. Поэтому `коллбэк хэл` - это классная штука, которая помогает разбивать код на независимые функции - принял данные, что-то сними сделал, отправил дальше как эти данные, так и другие аргументы. Точка.