Решил поделиться своим опытом «успешного» изучения языка(ов) программирования.
Не сказать, что в IT-индустрии я полный профан, однако мой план обучения «стать IT developer-ом» — с треском пошел по швам.
Немного предыстории.
Сразу скажу, что целенаправленного обучения по компьютерным наукам я не проходил. Да и специализация в образовании у меня далеко не техническая. Работал с 2005г. по 2012г. в различных компаниях, и мелких и крупных, непосредственно связанных с IT-индустрией. Научился всему понемногу: сис. администрированию Windows (даже MCP, MCSA успел получить), немного поюзал VMware (VCP тоже в копилке), дополнительно изучил разную кучу программ, которые сис. админы как правило используют в своей ежедневной работе.
Попробовал себя в корпоративных продажах, кстати, неплохо получалось. Успел поработать немного и у дистрибьютора ПО, а также в компаниях-интеграторах, неплохо разобрался в политиках лицензирования ПО. Планировал стать Project manager-ом, даже начал изучать PMBOK, тайм-менеджмент, различные международные стандарты, типа ISO, Tier, и даже замахнулся на PCI DSS.
Но в определенный момент перегорел, и все бросил. Ушел так сказать в отпуск на 8 лет.
После долгого анализа, все-таки созрел и осознал, что пора валить на запад, и желательно поближе к кремниевой долине, т.к. с английским более менее нормально, можно подтянуться до необходимого уровня.
Ежу понятно что меня там никто не ждет, а сис. админов, продажников и project менеджеров там и своих хватает. Тем более без знания ситуации на локальном рынке, сразу работу найти будет, ну как минимум проблематично.
В голове был выбран путь, что все-таки пора переквалифицироваться в разработчика. Так будет легче и лучше в плане перспектив и работы на западном рынке. Программистов на рынке труда всегда не хватало, да и не хватает до сих пор.
Тем более, как-то давно я хотел обучиться программированию и специализироваться по SAP направлению. Был выбран путь самостоятельного изучения основ, языка ABAP, но как-то забросил это дело. Не помню уже по какой причине, кажется из-за сложности в понимании.
Теперь сама история, поехали…
Так вот, спустя 8 лет отдыха от IT в целом, принялся изучать заокеанский рынок труда и решил для начала специализироваться в мобильной разработке. Погуглив языки программирования для мобильных приложений и вдохновившись, что Google официально анонсировала язык Kotlin как приоритетный язык для android-приложении, твердо решил максимум за 1 год самостоятельно выучить Kotlin и строить планы по иммиграции на ПМЖ в США.
Пару недель просмотра тренингов и чтения мануалов мне хватило, чтобы убедиться, что без знаний Java в Kotlin делать нечего. Хотя на просторах интернета многие твердят что можно выучить с нуля. А после регистрации на GitHub-е, установки IntelliJ IDEA, JDK и попытки разобраться в коде я уже начал осознавать что придется учиться очень-очень долго и упорно.
Было принято решение отложить Kotlin пока что в сторону, и углубиться в язык java. Так и сделал. Эх, помнится в мое время java был еще SUN-овским детищем.
Быстро переключился на Java без сожаления, т.к. и мануалов больше для самостоятельного изучения и вакансии для Java-разработчиков намного больше. Правда не определился с чего стартануть будет лучше: с Java, либо все-таки переключаться на JS, ну да ладно, думал походу разберусь. На форумах где-то читал, что с JS войти в мир разработки намного легче и быстрее.
Приступил к изучению Java стандартно, прочитав гору статей и просмотрев кучу видео «Как стать Java программистом». Скачал книгу Брюса Эккеля «Философия Java», по рекомендациям многих на форумах, как самый правильный старт изучения языка новичкам.
Так вот скажу вам честно, она нисколько не для новичков.
Пробовал не обращать на это внимания и читать дальше, усвояемость около 20-25%, понял что так дело не пойдет. Придется разбираться и в С языке, да еще и в книге регулярно черным по белому пишут, что материал рассчитан на читателей со знанием основ С языка.
Что-ж, выбора нет. Опять читаю кучу информации, сотни просмотров видео разной тематики о языке С. Качаю книгу Кернигана и Ричи «Язык С», приступаю к изучению, усвояемость уже получше чем в Java, так сказать около 50-60%, что вовсе не радует меня.
Успокаивало одно, что истинные разработчики все начинали с языка С, а также то, что после изучения С, другие языки, в частности Java, будут пониматься в разы быстрее и доступнее.
Однако такие заголовки в книге как:
«Настоящая книга не является вводным курсом в программирование; она предполагает определенное знакомство с основными понятиями программирования такими как переменные, операторы присваивания, циклы, функции»
или:
«предполагается рабочее владение основными элементами программирования; здесь не объясняется, что такое ЭВМ или компилятор, не поясняется смысл выражений типа N=N+1»
а также такие фразы как:
Символические константы.
и т.д.
постепенно подводили меня к тому, что без изучения Computer Science мне не обойтись.
Параллельно начинаю вникать в Computer Sciense, качаю опять-таки тонны книг. Регистрируюсь на Гарвардский курс CS50, приступаю к изучению основ программирования, внимательно читаю книгу Владстона Феррейра Фило «Теоретический минимум по Computer Science».
Замечаю, что обучение языку С переходит на второй план, все больше времени уделяется уже основам программирования.
И если в двоичном коде, переменных, функциях, циклах, компиляторе, интерпретаторе, простых уравнениях и т.д. я еще более менее разобрался, то выражение типа N=N+1 и более сложные уравнения меня загоняли в легкий ступор.
Я долго вникал почему 0 в степени 0 равен 1, и у меня ощущение что я до конца так и не понял всей сути.
А вот эта задача меня вообще заставила остановиться на чтении книги по CS, т.к. чем дальше читал, тем сложнее уже шли уравнения и задачи:
Пришлось гуглить про квадратные уравнения, как написано в книге и вникать в дискриминанты. Ну забыл, подумал я, алгебру, с кем не бывает. Однако я так и не смог решить самостоятельно задачу, пришлось обращаться за помощью к школьному преподавателю ребенка по математике.
Решение то получил, однако понять, как преподаватель решила не смог:
На мой вопрос: «как решаются такие уравнения?», ответ был очень прост:
«учи исследование функции, начало анализа и задачи на оптимизацию. Алгебра 10-11 класс».
Ну думаю, ок, посмотрю пару видео-примеров для школьников в youtube, пойму как решать их, и дальше буду «глокать» изучение по CS.
И вот после просмотра подобных роликов по алгебре меня осенило…
www.youtube.com/watch?v=RbX_QHxu7Lg
www.youtube.com/watch?v=FVSG7Neopuo
Я не то что не помню, как решаются такие задачи, — я элементарно, как выяснилось, попросту не знаю Алгебру за 10-11 класс!
Такие выражения как: пределы, математическое мышление, экстремум, производные, многочлены и т.д. для меня оказались как речь на языке племени Майя.
Наверное, мои познания математики остались на уровне уроков математики 5-6 классов.
Начинаю осознавать, что для полной картины понимания Computer Science, мне необходимо будет заново учить алгебру, а затем и ВысшМат. Не исключаю, что походу скорее всего, появится необходимость и повторения уроков физики и еще чего-то из школьной программы. И до реального изучения Java и JS мне понадобится лет 5 изучения алгебры и высшей математики.
До Марса и обратно быстрее долететь, всего то 1,5 года, как утверждают ученные…
Так вот, проанализировав прошедший месяц-полтора самостоятельного обучения, для меня стало очевидно, что я как «хомяк в колесе», вроде как бы и бегу (учусь), а по факту стою на месте. Знаний в программировании не прибавилось, разве что программку на С языке («Hello, world») смогу запустить.
Да еще и после свалившейся тонны новой информации в мой маленький мозг, он кажется вообще ушел «shut down», и категорически отказывается воспринимать новую информацию.
Алгоритм, построенный мной для изучения программирования, дал сбой практически в самом начале.
Стало понятно что надо пересмотреть свой план обучения и подход к нему.
Однако пока не до конца ясно представляю себе картину, и с какой стороны вообще теперь подходить к обретению профессии «Java-developer», ибо стандартный пусть обучения, с основ алгебры и высшмата, будет очень долгим и не подходит в моем случае.
И вот тут-то мне стало уже совсем как-то грустно.
Неужели чтобы стать программистом без технической базы, требуется так много времени?
Меня конечно вдохновляют статьи в интернете, где люди пишут, что за 1,5 года стали Java developer-ом и уехали в Германию, Канаду, США, однако оценивая свои печальный опыт я не уверен что такое возможно.
Или все-таки это не моё? И профессия «разработчик» — это для элиты, «касты особенных людей»?
Я знаю, что есть люди, освоившие программирование без получения высшего образования в компьютерных науках. Таких немало.
И я горю желанием присоединиться к таким замечательным и целеустремленным персонам.
Отпишитесь в комментах, плиз, у кого получилось освоить программирование, а также Ваше видение почему мой план и подход к обучению дали сбой. Ваши рекомендации будут весьма полезны для меня, пересмотра своего плана обучения программированию, а также амбиции и ожидании конечного результата.
Сомневаюсь что я один столкнулся с подобной проблемой. Даже можно сказать уверен, что таких как я, очень много…
Заранее благодарю!
Sdima1357
В список самых высокооплачиваемых профессий, для тех кто не любит математику, программирование не входит:
www.businessinsider.com/high-paying-jobs-for-people-who-hate-math-2014-11
usego
Чтоб формошлёпить на мобилках последнее что нужно — это математика. Автор слишком увлёкся археологией.
podde
А если именно программировать – то алгебра уровня старших классов школы нужна как минимум (а это немало; я в свою очередь класса с 7-го не в то русло энергию направлял и в алгебре страшные провалы, о чём сейчас порой очень жалею).
SakuradaJun
Конкретно алгебра не особо нужна, всем нужна пожалуй только алгебра логики. Остальное же от задач зависит — кому-то нужен весь матан, кому-то только матрицы, а кому-то ничего.
Я сам ни разу не программист и вкатиться не пытаюсь, но мне показалось странным что автор не понимает вот этого:
Это не уравнение. Это команда машине увеличить переменную N на единицу. То есть конкретно этот пример может работать как счетчик.
Мне кажется, что автору статьи сейчас нужен обычный школьный репетитор по информатике, который за месяц занятий покажет основы на примере бейсика или паскаля, и если даже после этого луч света не появится — тогда точно можно забыть про программирование как про страшный сон, а если что-то будет получаться — уже думать что делать дальше.
Graf54r
зачем ему бейсик и паскаль?
нужно решать задачки на java или котлин, хотя котлин без java все же сложноват. Математику(leetcode) можно делать после освоения языка. Язык осваивается в виде сделаных 5-10 проектов. В большинстве случаев достаточно изучения web сервисов. Ну либо смотреть проекты на андроиде. Для начала написать hello world, потом добавить логику потом бд дальше сходить на собеседование(устроитья не цель, но если возьмут это круто) — узнать что спрашивают и двигаться в этом направлении.
Не плохой вариант javarush как-раз чтобы голова не болела, что делать. Но полностью к собеседованию не готовит. Как варик можно курсы от jetbrains, правда только присматривался, вроде не плохие, но лично не пробовал.
Gazitdin
Основы программирования на паскале изучаются в школе. Думаю, обычный школьный репетитор по информатике не сможет помочь с решением задачек на java.
По моим школьным воспоминаниям, в паскале более или менее легко разобраться. Соответственно, можно быстрее попробовать себя в более осознанном программировании, чем "Hello, World!"
akryukov
Школьная алгебра нужна для того чтобы научить:
1) Точно выражать свои мысли (чтобы задача вообще была решена)
2) Оформлять их в строгой нотации (чтобы код скомпилировался)
3) Преобразовывать выражения из одной формы в другую без потери смысла (чтобы рефакторить)
Если человек не научился на алгебре раскрывать скобки у многочленов, то у него будут проблемы и в программировании.
Подробнее эту тему я раскрывал в своей статье Вот зачем нужна школьная алгебра
Sdima1357
Даже «формошлепить» математика нужна будет. Иногда весьма интесивная… И статистика и методы оптимизации и алгебра всяческая. А ещё неплохо бы изучить физиологию восприятия и промышленный дизайн(для качественного формошлепства). Конечно дорогу осилит идущий и полюбить можно и после свадьбы, но лучше все таки по любви.
janvarev
— Знаешь, как называется любовь за деньги?
— Продакшен, как же ещё! :)
Krypt
Интенсивная, но не вся. Стереометрия вам не понадобится пока вы не займётесь 3D. Интегралы/Дифференциалы же я живьём в рабочих проектах не видел.
Sdima1357
Ну а мне встречались. И всем кто занимается графикой тоже. Ну например:
en.m.wikipedia.org/wiki/Summed-area_table
Фильтры всякие, антиалиасинг…
Всегда можно обойтись без чего либо или выучить когда понадобится, но лучше все таки знать, чтобы хорошо делать работу
Krypt
К слову, summed area table не содержит Интегралов/Дифференциалов нигде, кроме 2го названия: «Integral Image»
Sdima1357
К слову это дискретный аналог интеграла или просто — дискретный интеграл.
И допускает обратную операцию дифференцирования. А еще у него есть много интересных свойств:
www.sfu.ca/math-coursenotes/Math%20158%20Course%20Notes/sec_VolumeAvgHeight.html
Добавлю еще. Метод позволяет быстро посчитать среднее значение на интервалах, что равносильно свертке с прямоугольной функцией, которая в свою очередь позволяет быстро найти приближение к свертке с гауссианом любой ширины(согласно предельной теореме) :)
Tiriet
как примеры:
Smoothed particles hydrodynamics- гидродинамика сглаженных частиц. применяется в GameDev-е для визуализации потоков жидкости и физики. Там диф-уры в частных производных в интегральной форме записи решаются.
Твердотельное моделирование (Компас-3D, SolidWorks, T-Flex etc.)- всякие огибающие и поиск точек касания- дифференциалов хоть отбавляй.
ЧПУ- если управлять «рукой» типа Куки- то там тоже дифференциальной геометрии с полярными координатами по самые помидоры. Гексапод без этой ерунды тоже ногами ровно дергать не сможет.
Krypt
Не все разработчики работают с 3D (по-моему, вообще — меньшая часть). Я, как iOS разработчик, и из чистой математики за пределами алгебры ничего не встречал. Самый же полезный навык — понимание алгоритмической сложности.
Периодически ради фана пишу моды для игр, математики в них на порядок больше:
Из того, что встречал/применял и что никогда не понадобилось в профессиональной деятельности: интегрирование, теория управления, мат.ожидание, собственно стереометрия, теория графов, конечные автоматы. Вот сейчас с симплекс-методом воюю… Конечные автоматы очень долго ждали своего часа, чтобы оказаться в списке «применено в том числе для рабочих задач».
В общем не хотите учить математику — идите в iOS разработку, тут вам ничего кроме геометрии не понадобится…
Spiritschaser
> Дифференциалы
Вообще любая динамика, не обязательно в играх — тупо нормальная модель динамики спроса (но в итоге её всё равно к линейной приводят)…
Kwisatz
Угу и всего этого не знает почти никто судя по интерфейсам и рынку труда.
anonymous
А где там статистика может быть нужна?
akryukov
Навскидку — для A/B тестирования
andreyverbin
Мне тоже так казалось до того как я попробовал обучить программированию своего брата. Выяснилось, что кроме умения читать книжки (о программировании) нужно ещё уметь мыслить как программист. А это навык, типа умения быстро бегать или боксировать, просто так, из воздуха не берётся. Несмотря на все наши попытки понять что такое массив и как его обрабатывать не получилось. Проблемы была в том, что братишка не мог в голове собрать как из мелких шагов на каждом этапе возникает целое решение.
saboteur_kiev
Вариант для школьника: обычный двумерный массив — это морской бой.
Обработайте несколько матриц — одна твоя, другая противника.
usego
Бесспорно, что математика формирует мышление хорошего программиста. Но это совершенно не означает, что бывший двоечник по математике не будет способен на плюс минус сносном уровне освоить условный реакт. В датасайнс и мл ему путь если не заказан, то будет крайне сложным, но 80% нынешнего потребительского программирования сильно проще.
andreyverbin
Математика один из путей, допускаю, что работа историка по исследованию документов, поиску противоречий и построению непротиворечивой картины событий тоже тренирует нужный навык. У гипотетического двоечника проблемы могут возникнуть не с реактом и не с тем, чтобы прочитать кучу документации и туториалов. Ему может быть сложно понять что делает цикл for, как составить даже тривиальный алгоритм типа «переверни список», как соотносится между собой тело цикла и конечный результат работы.
usego
Практически на все эти вопросы легко ответит хождение по коду дебагером + чтение соответствующей теории по алгоритмам. Только опять же, в 80% современной типовой работе даже на такой уровень закапываться обычно не приходится. Понятно, что с таким подходом сениором не стать, но автор вон и на путь джуна даже стать не может из-за любви к археологии.
shiru8bit
Когда-то, будучи совершенно практическим двоечником по математике (и не только), совершая свои самые первые шаги в программировании столкнулся с тем, что на единственном доступном компьютере оператор FOR в Бейсике просто не работал (битое ПЗУ, компьютер сбрасывался при выполнении оператора). Ни знающих людей, у кого можно было бы спросить совета, ни хоть сколько-то адекватной литературы под рукой не было. Как-то не сильно остановило и не помешало ни в написании своих первых программ, ни в выборе жизненного пути. Бывают разные люди и разные истории, и со своей колокольни мне кажется, что мотивация гораздо важнее таланта и знаний.
Neikist
Ну, формошлепить в долине — таки на собеседованиях это все нужно будет.
Mes
Сделать красивую анимацию на форме — математика как раз таки нужна
Lllanius
Этот список актуален для США.
Там на втором месте врач-педиатр, а еще есть медсестра.
Точно не для РФ и СНГ, у нас какой-нибудь педиатр — нищий.
Так что не совсем актуально в принципе.
Alexey_Alive
Ой, тут смотря какая математика! Про графы все же программисты знают?! А это часть дискретной математики. Мат.логику тоже все знают. Умение определять сложность алгоритма — тоже математика. Работаешь с float — должен знать часть вычислительной математики.
Если поставить вопрос так: насколько нужен «чистый матан» (мат.анализ) программисту, то получили бы интересное исследование. Критерии сходимости рядов, разрывы функции, множества Парето, Слейтера и т.д.
anonymous
Без хорошей школьной математики в программировании всегда будет. Всё-таки хорошая математическая база даёт преимущества в восприятии, написании, мышлении. В общем без математики никуда