Я наоборот считаю что учиться надо с С потом С++, тогда любой другой язык никогда учить не придется. Просто будешь брать и на нем писать через 2 часов знакомства. Примерно такой же логики придерживаются все нормальные вузы, которые готовят программистов.
Мне когда-то очень тяжело давался переход с Delphi на C++, потом после того, как таки разобрался с С++ (мне потребовалось года 2-3, чтобы чувствовать себя в нем уверенно), очень быстро освоил еще языков 5 наверное.
Сейчас занимаясь продюсированием тупею и потихоньку забываю языки, использую только С++, C# и ObjC в последнее время, порядка 1 000 строк кода в месяц в среднем пишу :)
DRON, это всё потому, что ты выше написал - книг не читал и вообще ты не программист. Пишу на делфи очень давно. Месяца хватило, чтобы разобраться и начать писать на шарпе. Глупости ты говоришь. Если человек программист, то ему достаточно хорошо, а лучше отлично, знать один ЯП, тогда другие даются легко. И тут нет разницы С это или бейсик.
Считаю что сейчас ценно учить шарп, а не плюсы, если уж на то пошло.
ObjC в последнее время, порядка 1 000 строк кода в месяц в среднем пишу :)
Это не говорит ни о чем.
Анекдот вспоминается: "О... я умею набирать 600 знаков в минуту! - правда? - правда! Но такая херня получается"
У ЯП бывают серьезные отличия, которые заставляют чутка напрячься при их изучении. Но это обычно означает разные области. Например С++ хоть и похож на HLSL, но привыкать придется всеравно. И дело не в синтаксисе. T-SQL тоже не похож ни на яву, ни на делфи. Причем ни синтаксисом, ни принципом.
DRON, при переходе с Delphi на С++ на каком уровне у тебя были знания Delphi раз ты 2-3 года изучал С++ и как ты учил С++? Может ты заходил в С++ пару раз в месяц.
Когда я изучал новые языки я спокойно мог пользоваться другими языками на том же уровне, что и язык с которого перехожу. Это было доказано при изучении PHP, JavaScript, Delphi и C#. Изучал в такой последовательности. Но при познании ООП при работе уже с Delphi я тут же уже мог юзать ООП и в JavaScript, и PHP. Так что не вижу проблемы перехода между языками. Если ты не вундеркинд какой :D
ObjC в последнее время, порядка 1 000 строк кода в месяц в среднем пишу :)
Это не говорит ни о чем.
Анекдот вспоминается: "О... я умею набирать 600 знаков в минуту! - правда? - правда! Но такая херня получается"
Это было написано к тому, что я считай вообще не прогрммирую, это же крайне маленький объем кода, когда я серьезно занимался работой то это была норма для нескольких дней, как правило для реализации какой-то таски требуется около 500 строк.
Если говорить про языки, то я не соглашусь. С++, как и Delphi например (хоть и в меньшей степени) и еще некоторые языки, заставляет разобраться с тем как устроена работа с памятью и так далее. Если ты будешь писать на С# сразу, то многое ты рискуешь так никогда и не узнать. Собеседовал я в этом году программиста, который использовал только готовые контейнеры на С# и уверен в том что они просто "растягиваются", добиться от него асимптотики ставки в конец вектора или хотя бы понимание про реалоцирование памяти, конечно не удалось. А вообще я много таких вот говнокодеров повидал.
2ZЫ
Ну я на дельфи писал лет 5 наверное к тому моменту. И в один момент отказался от него и начал писать на С++. Писать конечно я начал сразу же и к дельфи уже не возвращался. С первого захода сделал игру на OpenGL вот она http://dronprogs.org/files/sources/kkkill.rar (в каком-то конкурсе участвовала IGDC). Но нормально пользоваться шаблонами, указателями, лямбдами, STL и прочей лажей я начал через несколько лет. Тем более некоторые вещи вроде тех же шаблонов не были доступны тогда в Delphi. Вот спустя года 3 после изучения почувствал что собрал все грабли и могу вроде нормально что-то проектировать и разрабатывать на языке, тогда собственно DGLE2 и начал делать. Шишки собирал на DeeProEngine на котором было сделано только 2 игры в 2008 и 2009 году. А в 2010 появился DGLE2, как-то так. Потом я только подтвердил свои знания уже когда в Wargaming пошел работать, по этому и сужу что 3 года достаточно (при наличие опыта на другом языке), чтобы потом работать С++ программерос с зп выше среднего, скажем так.
Не поверишь, но чем меньше кода, тем лучше. Результатом работы нескольких дней могут стать всего несколько десятков строк кода и это нормально. Если только ты не начал писать какую-то новую либу с нуля, тогда да, от объема никуда не убежишь. Но, видимо, я работаю с монструозными системами, где чем меньше кода пишешь, тем лучше.
Если ты будешь писать на С# сразу, то многое ты рискуешь так никогда и не узнать.
Как раз с Мефом обсуждали сегодня. Начинать однозначно лучше с языков с четкой типизацией. Никто не спорит. Но плюсы это плохой старт, он слишком перегружен. Есть языки проще, см. тот же делфи.
А вообще я много таких вот говнокодеров повидал.
А сколько я повидал говнокода, сколько его правил и правлю до сих пор не представляешь. И всё это тоже на ЯП с четкой типизацией, где казалось бы программист должен знать что да как. Однако стоит посмотреть на утечки и видя цифры в сотни и тысячи утекших списков становится плохо. Если человек не понимает что он делает, то разницы с чего он начал нет. Я вот C# начал изучать с книжки CLR via C# чтобы понять что же там внутри и как оно работает. Почему 2.0 это дабл, а 2 это интеджер и не приводится автоматом как в делфях к флоату ни то ни другое. Прочитал и мне всё очень понятно и очень даже логично кажется. А если сразу брать и писать без книжек, то за 2-3 года ты только синтаксис дай Бог весь поймешь.
Так чтобы тема не переходила в холивар, сделаем поправку. Я высказывал свое ИМХО и при нем же и остаюсь.
Как я понял меня неверно поняли я з.п. к языку не привязываю ни в коем разе. Я хотел сказать что 3-х лет изучения С++ было достаточно, чтобы получать зп выше среднего _для_ С++ разработчика. При этом самый высокооплачиваемый язык это Java в интерпрайзе, ну и само собой всегда есть исключения.
С точки зрения кем проще найти работу я погуглил hh по запросам на кол-во вакансий по Питеру:
C++: 293
Delphi: 36
C#: 175
Java: 407 <- сюда много Java Script примешалось
"Для чайников" крайне уныло читается, имхо, слишком много воды (серия обязывает :D ), Либерти пока начал читать, потом, скорее всего, перейду на Страуструпа.
Я изучал С++ с помощью Шилдта, ибо его книжка по C# мне в свое время помогла. Так вот, его книгу по С++ крайне не советую. Полна ошибок даже в первых главах. Проблема в переводе или в первоисточнике - неизвестно.
Я вот не пойму чем вам так тяжек с++? По мне он логичен и поэтому прост, если бы мне сразу не говорили типа:"Не начинай с с++, он слишком тяжелый и бла бла бла", то я бы давно начал бы изучать его, мой совет: начинай с с++, и изучай его как в изображении ZbI, я не имею в виду путешествия во времени, а то что сначала начни с переменных, потом функции, структуры, классы, динамические переменные и классы и т.д., а слишком тяжелый бывает ассемблер
Ассемблер в современных реалиях уже не нужен. Только чтобы в дебаге понять что случилось (но для этого не нужно на нем уметь писать, достаточно понимать) или если уже что-то очень специфичное, мне за все время ни разу не приходилось его использовать, например. Сейчас С++ в современном мире выступает заменой асму ,)
DRON, посоветуй пару вопросов для собеседования на позицию программиста игр. а то я этим всё чаще и чаще занимаюсь, а одни и те же вопросы задавать уже не интересно.
По теме: читал Прата. Ок.
Но считаю вначале надо прочитать "Совершенный код" Макконелла, чтобы прочистить чакры.
Если все что советуют не переваривается - смотри на гугле и на хабре. В поисковиках тема топовая.
Для геймдева из контейнеров надо знать: vector, string, map.
Простое двигло для игр на С++ - HGE.
ProSergeant написал:
Я вот не пойму чем вам так тяжек с++? По мне он логичен и поэтому прост, если бы мне сразу не говорили типа:"Не начинай с с++, он слишком тяжелый и бла бла бла", то я бы давно начал бы
Сержант, ты мой кумир. До сих пор не могу отойти от кода на конкурс пиратов :)
2ProSergeant
Выложи код на paste code куданить, хочу почитать :))) Если не сложно конечно ) или отдельным архивом.
2Dan
Мой шортлист для собеседования программера, это заметки для меня самого, так что они сумбурны и без пояснений, не обессудьте (:
Математика
Векторы, матрицы, подпространства, базисы, линейные операторы - что про них известно?
Скалярное и векторное произведение, их смысл? (бонус за вывод векторного через определитель смешанной матрицы)
Повернуть вектор - способы? (бонус за гиперкомплексные ака кватернионы)
Какие алгоритмы известны вообще, семейства алгоритмов, например на графах (название и что делает, зачем применяется)?
Асимптотика что такое? O(n)? (бонус за o(n) и tetha(n))
Программирование
Бинарный поиск, сортировка пузырьком, квиксорт и их скорости? (бонус за пирамидальную и еще другие сортировки)
Какие структуры данных есть в STL и чем они отличаются? (бонус за понимание что у них внутри и когда какие используются)
Деревья, зачем? (красно-черное дерево, куча, сортировка кучей)
Алгоритмы из STL, хотя бы 5 любых?
Максимальная сложность вставки N элементов в конец vector (бонус за накопление "монеток")?
Выравнивание полей данных в структурах (пример: struct t { int i; bool b; char c; double d;}; sizeof(t) = ?)? (бонус если понимает как это зависит от компилятора/архитектуры и задает уточняющий вопрос)
Классы что такое, парадигма ООП? (если все правильно ответил, то на бонус спросить про ромбовидное наследование)
Уровни доступа к полям класса (public, private, protected), virtual методы и наследование (public, private и virtual)
VTable, pure virtual что такое?
Модификаторы (static, const, mutable, volatile (если знает, ловим на deadlock'ах ниже))?
Приведение типов cast'ы CPP vs С-style (в чем разница, когда как?)
new vs malloc?
Потоки, кооперативная и вытесняющая многозадачность? (бонус за deadlock и volatile)
Рефакторинг, реинженеринг, const - safe код, это про что?
Графика
Графический конвеер, как устроен?
Как хранить и выводить на экран геометрию?
Модели освещения чем отличаются? (бонус за формулу к любой на выбор, бонус за анизотропную)
Bump Mapping какие бывают, как работает и как реализовать? (бонус за Occlusion parallax mapping на пальцах)
Постобработка изображения, какие бывают? (рассказать как сделать простой Depth of field)
Какие постэффекты можешь придумать с использованием depth buffer?
Forward и Defered lighting?
Задания
Напишите программу, которая выводит на экран числа от 1 до 100. При этом вместо чисел, кратных трем, программа должна выводить слово «Fizz», а вместо чисел, кратных пяти — слово «Buzz». Если число кратно и 3, и 5, то программа должна выводить слово «FizzBuzz».
Что такое односвязный список? Какое время занимает вставка? За 10 минут на бумажке написать ф-ю, которая переставляет задом наперед односвязный список.
Наша любимая задачка про вагоны.
Задания для сениоров
Про указатели.
#include <boost\preprocessor\cat.hpp>
namespace _2
{
int ***p;
int *const *const *NEXT_P = p;
int **const *NEXT_P = p;
int *const **NEXT_P = p;
int *volatile *volatile *NEXT_P = p;
}
#undef NEXT_P
Что здесь обозначает "int Foo::**p;".
Какие из NEXT_P скомпилируются.
Написать рекурсивный реверс односвязного списка и объяснить, почему такой вариант медленнее итеративного.
Реализовать функцию возведения в степень "template T pow(T x, unsigned n);" за время O(log(n)) (рекурсивный и итеративный варианты).
Как организовать рекурсию в лямбде. (бонус за ответ почему это будет медленнее чем рекурсия в функции)