Итог:
1. Уверенное владение одним языком, вместо поверхностных знаний по 10-ти языкам;
2. Быть убеждённым, что потраченное время потрачено не зря;
3. Возможность писать полезные вещи;
4. На диванном уровне решать задачи от компьютерного зрения и программирования роботов до эмулирования нейронных сетей;
5. Получать удовольствие от процесса обучения
Список будет продолжаться
Всегда учил язык под задачу - месяца 3-4 уходило для достаточно уверенного владения. По мне - почти все языки в своей основе похожи. Но если Вы смотрите в сторону роботов, контроллеров - там, скорее всего, Си.
Я бы советовал принять во внимание следующее:
1) Знание всех тонкостей и нюансов языка не всегда нужно, а иногда даже вредно - в том же Си есть основные конструкции, а есть дебри, связанные с шаблонами типов. Шаблоны позволяют записать более компактно исходный код (но не делают меньше исполняемый код), но неспециалисту в шаблонах разобраться в коде потом может оказаться сложно. В любом случае, тонкости можно постигать со временем - по мере необходимости.
2) Гораздо важнее - знание основных алгоритмов, подходов и принципов программирования. Например, я всегда освобождаю динамическую память на том же уровне, где и выделяю: никогда не возвращаю результат функции в динамически выделенной в ней области памяти (или использую для этого специальный класс auto_ptr, который автоматически её освобождает). В итоге избегаю большинства проблем с утечками памяти, выявить и устранить которые бывает довольно трудоёмко. Если знаете основные принципы, то выбор языка уже не имеет большого значения, и любой новый язык можно освоить достаточно быстро. По этому пункту полезно разбираться в коде библиотек - чтобы узнать, как люди пишут.
3) По сравнению со сложностью проекта, в котором Вы будете участвовать, сложность самого языка программирования незначительна. Даже если Вы будете писать программы в одиночку, то всё равно Вам придётся сталкиваться с библиотеками, написанными другими, придётся изучать их возможности, интерфейсы, обходить баги и т.п. В том же Си сам язык - это малая часть по сравнению со структурами классов стандартной библиотеки STL.
Вот захотите Вы написать многопоточное приложение. На каком языке будете писать? На том, который знаете, или который лучше соответствует задаче? Например, сейчас есть такой язык Erlang, который заточен под параллельные приложения. Если нужно быстро соорудить программу, чтобы проверить какую-нибудь гипотезу, то, наверное, будете писать на знакомом языке. А если программа будет достаточно сложной и будет развиваться, то имеет смысл выбрать и изучить язык под задачу. Иначе Вы закопаетесь в собственных процедурах управления потоками.
Кроме собственно программирования часто упускают из вида процесс проектирования - как сделать так, чтобы потом все части программы работали слаженно и допускали изменения (см. "
Системная архитектура"). Неудачно спроектированный код часто выгоднее переписать заново, нежели бороться с постоянно вылезающими ошибками.