Научиться программированию может каждый? Майкл Чои, основатель Coding Dojo, на протяжении нескольких лет учит программированию как новичков, так и опытных специалистов. Из этого он сам извлек немало важных уроков, которыми делится в своём блоге.
В 2011 году я был партнером в процветающей компании и не мог найти квалифицированного, но не слишком дорогого разработчика, который поспевал бы за нашим ростом.
Была огромная разница между тем, чему учили специалистов на занятиях и тем, на что они были способны после окончания учебы. Один раз я нанял «разработчика», только что окончившего университет, и заплатил ему $120,000, только чтобы переучить его.
Я сломал всю голову, пытаясь понять, где же нам найти эффективных и недорогих разработчиков, и тогда-то на меня и нашло озарение… Начать внутреннюю программу обучения, которая могла бы за короткие сроки дать начинающим разработчикам и только закончившим учебу по этой специальности студентам возможность получить практические навыки программирования.
После того, как я обучил несколько сотен разработчиков и увидел их успех, я спросил себя: «Нужен ли вообще опыт программирования при правильном обучении?»
И я решил проверить свою идею.
Словом, на разработку системы, которая эффективно превращала бы за месяцы абсолютного новичка в работоспособного программиста, у меня ушло два года. С 2012 года я многое перепробовал для улучшения этой системы, чтобы эффективнее и оперативнее обучать тех, кто мечтает научиться программированию, но не имеет соответствующего образования.
Я хочу поделиться некоторыми удивительными выводами, к которым я пришел за годы преподавания.
Во-первых, нельзя сказать с самого начала, станет ли кто-то отличным разработчиком. Это особенно справедливо в отношении тех, у кого меньше ста часов опыта разработки.
Я делаю на этом акцент, потому что множество школ для программистов проверяют абитуриентов на знание алгоритмов и на основе результатов принимают решение, брать или не брать их в программу.
Позвольте объяснить. За годы моей работы я учил успешных tech-руководителей, предпринимателей, разработчиков с 10-15 летним стажем и выпускников ВУЗов различным языкам программирования: LAMP, MEAN, Python/Django, iOS и Ruby on Rails. Большинство из учащихся были абсолютными новичками в программировании.
Конечно, несложно догадаться, что разработчики с 15-летним стажем или даже выпускники-программисты справятся с обучением лучше тех, кто вообще никогда не программировал. Это верно на протяжении первых 6-7 недель нашей учебной программы, где наблюдается следующая картина:
Заметьте, что это обобщенная схема, успехи в обучении каждого студента уникальны.
И напротив, я видел и такие случаи, когда студенты, у которых поначалу с программированием было всё сложно, неожиданно начинали делать успехи и становились весьма успешны. Они догоняли опытных разработчиков и работали с ними бок о бок. Это меня крайне удивляло, особенно в начале моего преподавания.
Я видел, как студенты, которые раньше не могли писать простейшие алгоритмы, внезапно оказывались самыми успевающими.
Признаю, когда я только начал работать с некоторыми такими студентами, я беспокоился, стоит ли им вообще учиться в этой области! Я задавал себе вопрос, может мне нужно поговорить с ними и понять, нужно ли им программирование, потому что риск потерпеть неудачу весьма велик.
И я очень рад, что я ничего им не сказал. Потому что многие из них стали моими самыми лучшими учениками, а в дальнейшем – крайне успешными разработчиками.
Сейчас большинство моих студентов без опыта программирования показывают отличные результаты к концу 3-месячной программы, а некоторые из них становятся настолько же хороши, как и опытные программисты, пришедшие в нашу компанию, чтобы переквалифицироваться.
Ниже типичный график, иллюстрирующий некоторые из этих концептов.
И снова это довольно обобщенные данные. Я не говорю, что любой новичок покажет результаты лучше, чем опытные специалисты. Я заостряю внимание на том, что иногда к нам приходят уникумы, которые, бывает, превосходят опытных специалистов, хотя изначально они были слабейшими в группе.
На самом последнем потоке в Coding Dojo у меня было 20% выпускников-программистов и опытных разработчиков, и 80% студентов без малейшего опыта. Как и ожидалось, в первый месяц программы опытные учащиеся были лучше, чем те, кто никогда не программировал. В среднем, первые достигали успеха на 20-40% быстрее, чем вторые.
В середине второго месяца 60% студентов без опыта догнали остальных участников программы, а 10% даже начали их опережать.
Если бы вы спросили меня после завершения программы, кого из них я могу назвать самыми лучшими разработчиками, то вы удивились бы. Особенно если бы вы видели этих разработчиков в самом начале их обучения. Я бы выбрал троих студентов, у которых до начала нашей программы не было никакого опыта, и одного с соответствующим образованием.
Я не заявляю, что опытные разработчики показали себя хуже. Их опыт действительно пригодился, но я начинаю осознавать, что он не связан с тем, насколько хорошими разработчиками люди могут стать.
Во-вторых, каждый может научиться программированию, хотя не от всех стоит ждать линейного прогресса.
Благодаря упорству и хорошему учителю, каждый может научиться программированию. И хотя разработке можно научиться, просмотрев десятки, если не сотни туториалов, такой способ потребует гораздо больше времени. Он также может быть неэффективным, если новичок в программировании просто не может выделить релевантную информацию. И в правильной обстановке обучение можно значительно ускорить.
Вот пример из моей жизни. Когда мне было 14 лет, я переехал со своей семьей из Кореи в США. До этого я учил английский на протяжении нескольких лет. А после переезда в Штаты я понял, что совсем не могу разговаривать! Я чувствовал себя подавленно и зажато. Хотя я столько лет учил английский, эта учеба совершенно не подготовила меня к погружению в англоговорящую среду.
Несмотря на то, что я старательно учил язык, мне было сложно выполнять всю домашнюю работу, готовиться к тестам и заводить друзей. Мне казалось, что никакого прогресса вовсе не происходит. Даже к концу моего первого семестра мне казалось, что я ни слова не понимаю из того, что говорят мне учителя и одноклассники.
Тем не менее, нечто удивительное случилось за время летних каникул. (Учтите, что в это время я особо не учился.) Когда я вернулся в школу, я внезапно осознал, что понимаю всё, что говорят мне люди!
Оглядываясь назад, я понимаю, что это были те самые моменты озарения, когда все проясняется.
Обучение программированию очень похоже на обучение новому языку. Оно часто состоит из нескольких таких «моментов просветления», когда успехи значительно возрастают. Схожим образом, обучение ускоряется, когда учащегося погружают в него с головой.
Ещё я понял, что прогресс в программировании абсолютно не линейный. На самом деле, он выглядит так:
Часто вам кажется, что несмотря на ваши усилия, вы нисколько не продвигаетесь вперед. А главное — продолжать идти к цели и никогда не сдаваться. Учитывая старание и желание, каждый может достичь своего «момента просветления», который выведет его на следующих уровень.
И с другой стороны, если вы не настойчивы и не погружены в программирование, ваш прогресс просто останавливается.
Заключение
Подводя итог всему вышесказанному и основываясь на своём богатом преподавательском опыте, я могу сказать, что каждый может научиться программированию. Вне зависимости от первоначальных способностей. Некоторые могут усвоить программу быстрее или достичь более высокого уровня знаний, чем другие. Но, благодаря хорошим учителям и правильному окружению, каждый, кто обладает старанием и желанием, может научиться программированию.
Если кто-то вдвое талантливей чем другой, это не означает, что он будет и в два раза способней. Зачастую те, кто находился среди аутсайдеров, становятся лучшими.
Человеческий потенциал не ограничен, и мы не должны судить людей по их текущему уровню, а должны учитывать их потенциал и вдохновлять их продолжать учиться, особенно если они увлечены учебой и хотят стать лучше.