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