(Поскольку люди спрашивали: Sublime Text 3 с «Spacegray Light» («платиново-серый светлый») из Materialize и гарнитура Ubuntu Mono Bold)
Как и большинство других студентов, обучавшихся по программе компьютерных наук в Калифорнийском университете в Сан-Диего, я в течение нескольких лет шёл через различные курсы просто «накатом». Я никогда не был ни хорошим, ни плохим по успеваемости, и мой средний балл был «не очень». Я любил курсы программирования с их чрезвычайно сложными заданиями; математический анализ же был мне не по душе.
В этом нетехническом посте я хотел бы (для разнообразия) поделиться моим опытом работы с проектами с открытым исходным кодом. Эти проекты оказали мне огромную помощь в дальнейшем при получении места для стажировки (в т.ч. в Amazon, которое превратилось позднее в постоянное рабочее место).
Если вы сейчас изучаете компьютерные науки или предполагаете делать это, то надеюсь, что вам будет полезен мой опыт.
ЗАМЕЧАНИЕ: этот пост стал очень популярным после того, как я поместил его в нескольких подфорумах на сайте reddit.com. Развилось несколько интересных обсуждений на /r/compsci, /r/cscareerquestions и /r/programming, которые, возможно, привлекут и вас.
Практический опыт, пожалуйста
Только после почти трёх лет в университете я понял, что имеется разрыв между компьютерной наукой (информатикой, в широком смысле), с одной стороны, и практическим программированием и разработкой программного обеспечения, с другой стороны. Я не знал этого сначала.
Со временем мне стало не хватать лекций по практическому программированию в моём курсе информатики. Я пассивно ждал, что меня будут учить таким вещам, как веб-дизайн и разработка мобильных приложений. То, что я не мог перевести весь накопленный багаж знаний по программному обеспечению в простейшие из идей, вызывало сильнейшее неудовлетворение.
Я видел также различные обсуждения на эту тему на /r/cscareerquestions (карьерном сабреддите), что заставляло меня думать о множестве студентов, ощущающих то же самое относительно отсутствия университетских курсов по практической информатике. Со временем я понял, что обучение было специально разработано так, чтобы учить нас думать с позиции проблем и решений, а не вращаться вокруг языков программирования и архитектуры программного обеспечения.
Оглядываясь назад, я вижу, что не понимал достаточно хорошо, насколько проекты «для души» могут расширить мои перспективы получения работы. Из разговоров на эту тему в кампусе и из блогов различных сотрудников я узнал, что наличие сторонних проектов может неожиданным образом помочь в нахождении работы. Среди студентов довольно интенсивно обсуждалось, как портфель сторонних проектов может устранить необходимость в приличном среднем балле при выпуске. Моё отношение к этому было довольно скептическое.
Первые шаги
В летние каникулы после моего второго года обучения я решился, наконец, попробовать себя в деле. Это было, когда я рискнул войти в мир программного обеспечения с открытым исходным кодом. Однако я придавал слишком большое значение знанию нескольких языков программирования. Это ощущение изменялось со временем, но оно было полезным. К тому времени я работал с Java, C и C++ в учебных курсовых проектах. Я уже также пробовал немного работать с Python на Codecademy и на простом проекте бота для социального новостного сайта Reddit.
Я решил выучить самостоятельно несколько языков программирования во время летних каникул, чтобы моё резюме выглядело более солидным.
Я сосредоточился на JavaScript, Python и немного на PHP. Я рад, что удержал свои мечты в определённых границах и работал над небольшими проектами. Я сделал safcat, х-poster и RecoverTabs — всё это расширения для Safari, которые удовлетворили некоторые из моих желаний. RecoverTabs стал первым моим проектом, получившим известность на GitHub; он добавил к Safari функцию Cmd+Shift+T, которая входит в комплект всех других браузеров, в то время как Safari поставляется с неполным функционалом.
После некоторых колебаний я решил изучить, сам, разработку веб-сайтов. Я написал свой персональный сайт с нуля (не этот). Я не знал фреймворков UI, типа известного Bootstrap, поэтому я ринулся вперёд и сделал нечто подходящее из ничего, что оказалось исключительно удовлетворительным продуктом, в конечном счёте.
Поскольку у меня сначала не было ясности в этом направлении, то мой опыт веб-разработки унаследовал на удивление большое количество конкретной практики, даже, как серверного специалиста. Всегда хорошо быть именно той персоной, которая, как оказывается, знает пользовательский интерфейс, тогда как никто другой не хочет даже прикасаться к нему. В конце концов, это подтолкнуло меня на путь разработки веб-программ (серверных приложений) как профессионально, так и как увлечение, в противоположность разработке мобильных приложений и других вещей.
Даже после того как я разобрался со многими другими направлениями, веб-разработка остаётся одним из моих основных увлечений: она позволяет мне очень эффективно расслабляться.
Мне кажется, что веб-разработка является одним из самых лёгких способов набрать портфель сторонних (параллельных) проектов для студента, желающего как-то начать карьеру. Это связано с тем, что программные компоненты веб-разработки намного проще, чем пользовательские интерфейсы мобильных приложений, построенные на других принципах. Веб-разработка даёт вам немедленную обратную связь при работе, что действует весьма воодушевляюще, пока вы в этом новичок.
Год проектов
После каникул я продолжал работать над увлёкшими меня проектами.
Получив опыт с пользовательским интерфейсом, я сосредоточился больше на серверных структурах, таких как Express.js и Flask, полагая что, если у меня появится хорошая идея, я не должен зависеть от кого-либо при разработке пользовательского интерфейса. Я должен иметь возможность завершить продукт и вывести его полностью самостоятельно.
Теперь, когда дело пошло, я начал работать одержимо. Я сделал API-адаптер Node.js, утилиту рабочего стола, использующую NW.js, и даже разработал CSS-тему для сабреддита, который я модерировал.
На третьем курсе университета я часами занимался сторонними (параллельными) проектами просто потому, что мне было это интересно. Часто это отнимало время не только у развлечений, но и у учёбы в университете. Но, оглядываясь назад, я совсем не жалею об этом.
Опыт, полученный из моих персональных проектов, был неоценимым. Никакой университетский курс не мог бы заменить его.
Теперь, когда у меня был блестящий (и растущий) портфель на GitHub, я поступил на стажировку в Learning Equality — некоммерческую организацию, занятую созданием ПО и базирующуюся в кампусе Калифорнийского университета в Сан-Диего. Эта стажировка дала мне первый опыт проектирования программного обеспечения в «реальном мире». Помню, что мой интервьюер назвал меня «сильным кандидатом» во время нашей первой короткой встречи.
В то время я обращался во все места в поисках летней стажировки. Какое-то время я довольно сильно нервничал, полагая, что не смогу найти что-либо стоящее из-за моего далеко не лучшего среднего балла (2,96). После телефонных и онлайн-переговоров со множеством компаний я был приглашён на интервью с Amazon, происходивший в кампусе университета. Я не ожидал чего-то особого от этой встречи, но я был встречен, проинтервьюирован и, в конечном итоге, получил работу.
Эта стажировка в Amazon превратилась в постоянную занятость позднее, после окончания университета (я закончил со средним баллом 3,07). Я был в восторге.
И даже после получения стажировки в Amazon я продолжал заниматься увлекавшим меня делом. Наиболее памятной была разработка Quibbler.
Хороший портфель проектов может только помочь вам в дальнейшем.
Ловушки для новичков
Теперь я позволю себе указать несколько общих ошибок, которые совершают те, кто начинает свои собственные проекты. Некоторые из положений могут показаться спорными, но они представляют просто моё мнение, сформировавшееся как из опыта, так и из личных наблюдений. Не стесняйтесь воспринимать это критически, поскольку мой опыт не может быть применён к каждому универсально.
Разрабатывайте программы с открытым исходным кодом
Когда у меня появляется какая-то идея проекта, то я провожу некоторое планирование, которое включает в себя следующие этапы:
1. Поиск оптимальных методов для выбранных мною языка / платформы;
2. Выбор правильной структуры данных для данной работы;
3. Планирование механизмов развёртывания и обновления.
Всё это имеет больше отношения к тому, что «вокруг» программирования, чем к самому программированию. Ваши университетские курсы возможно не акцентировали ваше внимание на том, как ваше программное обеспечение надо будет развёртывать или распространять, а затем поддерживать через обновления.
Работая над проектом, очень полезно спланировать эти направления деятельности заранее. Подумайте о том, как ваше веб-приложение будет работать на сервере или как ваша программа будет получать обновления, и как вы будете доставлять их. Всё это поможет с самой реализацией. Поскольку на вас не будет давить график сдачи работы, то вы сможете затратить столько времени, сколько требуется для использования наиболее оптимальных методов. Недостаточная продуманность структуры будущей системы — плохой выбор.
Написание программ с открытым исходным кодом означает также написание такого кода, который:
1. Присутствует в репозитарии в интернете с достаточной документацией;
2. Может быть прочитан, интерпретирован и доработан другими программистами;
3. Вам не стыдно выставить в интернете.
Это — отличный способ приучения самого себя к хорошим навыкам программирования. Реальное проектирование программного обеспечения является не просто и не только программированием.
Кроме того, полезно показать свой код потенциальным работодателям.
Начинайте с малого
Не бойтесь, что ваши проекты представляются слишком малыми или незначительными. Указывайте их все в вашем портфеле в любом случае.
Более того, я предлагаю намеренно выбирать небольшие проекты. Чем меньше проект, тем легче его завершить и поддерживать. Сосредоточьтесь на том, что вам требуется для приобретения конкретных знаний. Не начинайте свой проект следующей большой социальной сети. Некоторые идеи не выглядят такими трудными, какими они являются на самом деле.
Начинаете работать с JavaScript? Сделайте расширение для браузера. Желаете попробовать с Python? Сделайте небольшую утилиту командной строки и опубликуйте её. Иногда даже деплой становится проблемой.
Совет специально для начинающих: заполняйте свой портфель совсем маленькими проектами (не расстраивайтесь из-за этого). Вы скоро ощутите, что для вас достижимо (без чрезмерных усилий), а что нет.
Старайтесь действовать в одиночку
Не зацикливайтесь на стартовых проектах только потому, что у вас нет людей для совместной работы.
Хотя сотрудничество на сторонних проектах может быть полезным, я почти всегда делал такие проекты сам. Самостоятельные разработка архитектуры программного обеспечения, отладка и решение проблем — невероятно полезное дело.
При выборе партнёров учитывайте их умение, навыки и мотивацию. Если у вас есть единомышленники, то — дерзайте! В противном случае можно столкнуться с ленью. Сторонние проекты, сами по себе, уже сверхурочная работа. Такой проект трудно начинать. Каждый будет стараться переложить тяжёлую работу на других. Много времени будет потеряно на ожидание того, когда другие закончат свои небольшие кусочки работы. Члены команды, имеющие больше опыта, будут вынуждены останавливаться, что является пустой тратой драгоценного времени.
Работа в одиночку означает, что вы можете спланировать время, отводимое на эту деятельность. Поскольку у вас нет никого, кто снял бы с вас часть нагрузки, то вы, в конечном счёте, изучаете все составные части проекта. Вы сталкиваетесь с большим количеством проблем и возможных тупиков, с которыми вы должны разобраться, что означает дальнейшее обучение.
В любом случае, я полагаю, что вы должны попытаться сделать что-то по собственному усмотрению в какой-то момент.
Понимание процесса сопровождения программного обеспечения
Работа в рамках сообщества разработчиков ПО с открытым исходным кодом подразумевают ответственность за ваши разработки. Со временем вы начнёте (вам просто придётся) знакомиться с культурой этого сообщества. Учтите, что вы являетесь владельцем и сопровождающим лицом любого проекта с открытым исходным кодом, который вы разместили в сети. Если люди посчитают ваш проект интересным, то они могут начать взаимодействовать с ним, давая предложения или внося изменения. Ожидается, что вы будете соответственно восприимчивыми к ним. Так что не отказывайтесь от поддержки собственных проектов после версии 1.0.0.
Обычной практикой является активное поддержание-сопровождение любого программного обеспечения вообще. Даже если ваше ПО не имеет открытого исходного кода, но у него много пользователей, хорошим тоном является продолжение его развития. Пользователи могут ожидать появления каких-то новых функций хотя бы изредка.
Сопровождение не останавливается на этом. Будьте в курсе всех расходов, с которыми вы можете столкнуться даже после завершения проекта. Создание iOS-приложения для распространения через App Store означает выплату 99 долларов в год для сообщества разработчиков. Если вы занимаетесь веб-разработками, как я, то вам, возможно, придётся платить за серверное время, чтобы сохранять свои проекты на плаву и доступными для просмотра потенциальными работодателями (кому понравятся мёртвые ссылки в портфеле?). Если вы планируете экспериментировать с веб-сервисами Amazon, то будьте вдвойне осторожнее, предварительно оценивая расходы. В то время как некоторые из их продуктов могут быть использованы бесплатно или по минимальной цене, другие могут оказаться экономически эффективными только при масштабном использовании.
Скажите «нет» заранее подготовленным хрестоматийным проектам
Это, в большой степени, дело личных предпочтений, но я не люблю изучать программирование по учебникам. Я категорически отказываюсь программировать что-либо, что было разработано как упражнение для учебника. В то время как некоторые считают, что учебники и обучающие онлайн-программы являются хорошей начальной точкой для изучения языков и структур (я сам много раз использовал онлайн-платформу Codecademy в прошлом), есть некоторые вещи, которые просто отсутствуют там:
1. Учебники редко показывают, что представляет собой реальная разработка с описываемой в них технологией;
2. Учебники не рассматривают проблемы, с которыми вы часто сталкиваетесь на практике.
Я обнаружил, что моё обучение идёт лучше, когда я делаю реальные, полезные вещи. Очень трудно выдать оригинальные идеи, поэтому не думайте, что вы один такой. И всё же я считаю, это — лучший способ продолжать сохранять интерес к проекту.
Вообще, я всего лишь создаю нечто, что до меня никогда не было сделано. И для меня ситуация выглядит как «новая идея или провал».
Не расстраивайтесь
Работая над проектом, очень легко наткнуться на «кирпичную стену» и остановиться в растерянности. В университете, колледже или школе вы можете найти наставников или преподавателей, которые помогут вам с этой «стеной» в курсовых проектах. Но в ваших собственных проектах такого человека нет.
«Кирпичные стены» можно преодолеть. Хорошо, если у вас есть время и возможность искать помощь в интернете. Не стесняйтесь обращаться за помощью.
Каждый раз, когда вы сталкиваетесь с проблемой, вы получаете ценный опыт. Иногда встречаются проблемы, связанные с зависимостями, решение которых находится полностью вне вашей досягаемости и тогда ваш проект будет останавливаться в подвешенном состоянии. Но всё это даёт неоценимый опыт.
Помните: у вас не будет наставников, чтобы помочь вам с вашим кодом, когда вы начнёте работать в реальном мире.
Как бы то ни было, каждый неудавшийся проект разработки помогает укреплять душевную стойкость по отношению к сильному разочарованию.
Завершение ваших проектов
Наконец, вы должны стремиться закончить и выставить, по крайней мере, одну стабильную версию каждого проекта. Недопустимо, чтобы ваш портфель на GitHub состоял полностью из, например, 20 набросков и затравок идей, которые никогда никуда не пошли. Это производит плохое впечатление. Работодатели хотели бы видеть портфель, показывающий, что вы компетентный и достаточно уверенный специалист, способный выдавать что-то действительно ценное. Правильная упаковка, распространение, сопровождение и обновление приложений, веб-приложений и сервисов представляют собой непростое дело и требуют особого умения.
Бонус: представляйте свои проекты в выгодном свете
Ваша статья имеет много правильных положений. Всегда приятно видеть ещё одного студента Калифорнийского университета в Сан-Диего, принимающего участие в метадискуссии по компьютерным наукам!
Я, в частности, согласен с вами по персональным проектам; основное, что я советовал студентам по их резюме, было следующее:
- Переместите ваши проекты выше в вашем резюме или
- Делайте больше персональных проектов, если у вас нет профессионального опыта
Не говоря уже о том, что если вы желаете быть хорошим специалистом по программному обеспечению, это требует практики, и множество ошибок, сделанных при разработке персонального проекта, является наилучшим способом научиться!
«Как я начал писать сторонние проекты, чтобы набраться опыта» — мой опыт и некоторые рекомендации новым и/или продвинутым студентам, изучающим компьютерные науки.
Пользователь сообщества Reddit /u/k3q3 отметил очень хорошее положение в ответе на оригинальный пост. Определённо, необходимо представлять в выгодном свете свои проекты в начале вашего резюме, особенно если у вас нет опыта работы. Ваши проекты дадут вам больше шансов на работу при обращении к работодателю, чем почти всё остальное (курсы, степени, средний балл), что вы могли бы указать в вашем резюме (кроме, конечно, соответствующего опыта работы).
Откуда приходят идеи?
Ранее я уже писал, что я не работаю с партнёрами, не пишу программы по заранее подготовленным задачам из учебников и делаю только новое и оригинальное программное обеспечение. Откуда взялась эта идея?
Если вы ознакомитесь с моими проектами, то увидите, что большинство из них далеки от революционных. И в этом-то вся соль. Ваши проекты вовсе не обязаны быть переворачивающими мир. И поскольку это не самая простая работа — приносить в мир новые идеи, вы можете получать вдохновение от того, что делают другие.
Если вы пока неопытный программист в школе или университете, то вот несколько идей (которые соответствуют всем моим критериям), чтобы зажечь ваше воображение:
- Разработайте ваш персональный веб-сайт с вашим портфелем (пример: тот сайт, на котором размещён данный пост).
- Разработайте расширение браузера, которое сделает вашу жизнь проще (пример).
- Сделайте библиотеку-оболочку вокруг какого-нибудь интерфейса прикладного программирования (API), используя язык по своему выбору. Мир может всегда использовать больше оболочек API (пример).
- Разработайте утилиту командной строки, которая сделает вашу жизнь проще (пример).
- Разработайте некоторую инфраструктуру (проект или что-либо иное) для других специалистов, чтобы они могли создавать свои собственные проекты на её базе (пример).
- Возьмите Raspberry Pi, установите Arch Linux, сделайте устройство доступным через интернет и SSH, подсоедините датчики и контролируйте температуру в помещении и другие характеристики. Хотя здесь мало самого программирования, но научиться можно многому.
- Создайте бот для Reddit (или Хабра)! Сделайте кому-нибудь запрос на /r/RequestABot и наблюдайте на /r/botwatch, получая помощь и вдохновение.
Важное дело, которое надо сделать сначала — это запустить процесс. Работая над проектами программного обеспечения, вы неизбежно встретитесь с любопытными вещами на GitHub, которые вдохновят вас. Внимательно следите за тем, что делают коллеги, и старайтесь ввести их наработки в ваши собственные проекты. Увлекаясь веб-разработкой, я всегда отслеживаю интересные подходы к иерархической навигации, одностраничным веб-приложениям и другим элементам взаимодействия с пользователем. Если вы увлечены разработкой мобильных приложений, то путешествуйте по нравящемуся вам магазину приложений и находите вдохновение. Отыскивайте предпочтительные для вас языки и технологии на GitHub, чтобы понять, что могут и умеют делать другие.
И обязательно взаимодействуйте с другими разработчиками, которых вы находите по пути. Пишите программы, которые будут дополнять созданное другими.
Удачи!
Комментарии (14)
POLYX
19.09.2016 23:07Полностью согласен. Я тоже сейчас учусь на 3 курсе и с самого начала обучения фокусировался на развитие вне универа за счет своих проэктов благодаря чему имея как и автор не очень хорошие оценки получил стажирожку в компании которая делает QT, а туда я попал из за того что познакомился с одним из разработчиков этой компании на конференции проходившей в универе. Поэтому очень советую при возможности ходить на конференции или митапы. И помните что чтобы попасть на конференцию не всегда надо покупать дорогой билет, ведь можно устроится волонтером или как делают многие конференции воспользоватся студенческой скидкой. Так-что не забывайте про нелюбимый многими «networking»
hlogeon
20.09.2016 01:35Я вас предупрежу о том, что меня в итоге отчислили из универа, несмотря на отличные оценки по профильным предметам) Чересчур увлекся называется ^^ Никакого серьезного отпечатка на моей(имхо, довольно неплохой) карьере это не наложило, но кому-то наличие диплома может быть важно(я не о работодателях, а лично о Вас). А вы и сами наверное уже видете, насколько ваш профессиональный уровень УЖЕ отличается от одногруппников(вангую, что 90% не знают толком, как открыть IDE). Желаю дальнейшего профессионального развития и не забывайте помимо стажировки куражиться над своими проектами, пробуя новые подходы и технологии.
khrisanfov
20.09.2016 06:16Это слишком узкотематические знания. Знания как открыть IDE выходят за рамки обучения в универе. Как сказал один из моих преподов это «примитивная работа». Я с ним согласен. В универе преподают фундаментальные знания по максимальному количеству смежных с вашей будущей профессией областей. У меня, например, это была математика, нейросети, базы данных, ООП, кластеры, схемотехника и электроника и многое другое. Быть экспертом в чем то одном хорошо, но знания в сопутствующих областях очень помогают в итоге расти по карьерной лестнице и развиваться как личность. Я однажды сказал «умные слова» по поводу микроконтроллеров на собеседовании и это мне помогло устроиться на работу, хотя я ни разу не был практиком по МК, паяльника в руках не держал и не написал ни одной программы в своей жизни для МК. Вообщем рано говорить, что диплом не нужен. Рано или поздно это аукнется.
hlogeon
20.09.2016 07:08Вы не уловили мою мысль, я говорю совершенно не об этом. Вряд ли можно говорить о способности человека писать, если он этого никогда не делал. И уж тем более вряд ли можно назвать человека, не написавшего ни строчки поэтом, понимаете, или всё еще нет?)
almkhaj
20.09.2016 10:39Немного в защиту университетского образования: там, по идее, дают широкий спектр знаний, который должен превратить обучающегося не просто в хорошего специалиста в отдельно взятой области, а еще — в культурного и интеллигентного человека. Ну, так нас учили еще когда Советский Союз был и не все высшие учебные заведения университетами были (а дух университетский, поверьте, он особый).
hlogeon
20.09.2016 12:26Я ни в коем случае не хочу умалить значение университета в жизни человека в целом. Я с большим теплом вспоминаю это время. Помимо основных навыков(которые всё-таки лучше получать самому), университет дает еще кучу полезных связей и контактов, учит заниматься самообразованием и исследованиями, задает вектор развития. Много плюсов еще назвать можно, но, увы, это относится далеко не к каждому высшему учебному заведению. И, что тоже немаловажно — нужно уметь это «брать». А то я так часто слышу, что кого-то чему-то не научили… Люди не понимают, что УЧИТЬ должны были только в школе, дальше ты САМ должен учиться.
0xd34df00d
20.09.2016 09:00+3получил стажирожку в компании которая делает QT
Поздравляю со стажировкой в Apple!POLYX
20.09.2016 10:05Не понял при чем тут фруктовая компания?
xmonoid
20.09.2016 16:27+1QT — сокращение от QuickTime, мультимедиа-проигрывателя от Apple. А вы, вероятно, имели в виду набор C++ библиотек Qt (вторая t строчная). Не берите в голову, на Хабре любят до этого докапываться, будто заняться людям больше нечем.
pastuh9090
20.09.2016 16:23Отличная статья и ценный перевод, вдохновляет как никогда! спасибо автору за перевод.
hlogeon
99% опыта, который я получил в первые 3 года своей карьеры — собственные проекты. И, кстати, имхо, но если у человека нет идей для собственных проектов — скорее всего он выбрал не ту профессию(я не категорично это говорю, просто обычно, так и оказывается). Что я только не писал — игры, архиваторы, менеджеры паролей, блоги, расширения для браузеров. Проблема всегда была в том, что бы из 1000 вариантов выбрать, но никак не в том, что вариантов у меня нет. А так — очень хорошая статья, которая структурированно формулирует очень многое из того, что мне приходится говорить людям из раза в раз. Спасибо)