Как стать хакером

  • Эта публикация - перевод статьи. Ее автор - Zach Alberico. Оригинал доступен по ссылке ниже:

Почему этот документ?

Когда мне было тринадцать и я начал учиться в школе, я читал пост в блоге ESR: Как стать хакером. Я был рад узнать о сообществе программистов, работающих вместе над созданием продуктов через интернет, и это привело меня к тому, что я попробовал установить Fedora Core 4 и, в конце концов, Ubuntu 6.06, с помощью которых я узнал много нового об устранении неполадок самостоятельно и попытался заставить вещи работать на самом деле. В итоге это оказалось очень важным для развития навыков, которые помогли мне получить ту работу, которая у меня есть сейчас. Я прочитал о Python и написал тривиальные программы, и решил, что хочу изучать информатику и понимать, как на самом деле работают компьютеры. Это была довольно влиятельная должность для меня в то время, когда я не был уверен в том, чем я хочу заниматься.

Выросший в пригороде Баффало, штат Нью-Йорк может быть довольно изолированным - и хотя мне повезло, что мой отец программировал Apple II в колледже для развлечения (так что у него был некоторый опыт / хакерский дух), он не знал много о более современных разработках программного обеспечения. Мне нравились компьютеры и я играл с ними, но я не знал много о том, что возможно и где даже искать, чтобы понять больше. Когда поисковое пространство настолько велико и есть много неизвестных неизвестных, может быть трудно даже найти хорошие источники информации, на которых можно было бы учиться. Способность выбирать хорошие источники информации требует некоторых существующих знаний, и без руководства опытного человека это может быть затруднительно. Я думаю, что сейчас, наверное, лучше, когда интернет более развит, но в каком-то смысле есть еще больше возможностей для просеивания информации, чем было тогда.

Шестнадцать лет спустя я подумал, что было бы здорово написать свою собственную версию "Как стать хакером", чтобы дополнить оригинал ESR: что-то, что я хотел бы прочитать сам в тринадцать лет, что фокусируется на некоторых других аспектах, которые я бы тоже нашел полезными. Множество постов о программировании и смежных темах - это сплошные крики, попытки убедить вас перенимать специфический язык программирования, фреймворк, операционную систему или специфический способ делать вещи. Этот пост делает меньше, и хотя я делаю некоторые предложения, это более сдержанный взгляд. Его цель - заполнить нишу того, что, как мне кажется, я хотел бы прочитать после оригинального сообщения ESR (так что вам следует сначала прочитать это сообщение).

Есть чему поучиться

В начале я помню, как читал статьи и книги, но не понимал много жаргонов - это нормально. Вещи, которые на первый взгляд кажутся непостижимыми, постепенно становятся понятными, когда вы подвергаетесь большему воздействию этого и углубляетесь в каждую вещь, которую вы не понимаете. Хорошо просто продолжать читать и анализировать, искать вещи, которые вы не понимаете, и задавать вопросы, когда можете (у ESR также есть хороший пост о том, как задавать хорошие вопросы).

Каждый в какой-то момент впервые узнает что-то, и все будет развиваться медленно, пока вы не освоитесь с основами. Я помню, что не понимал мелких деталей (например, не знал, как вводить команды в терминале для их запуска, или что компакт-диск означал «изменить каталог»). Вы узнаете об этих вещах в результате воздействия, и чем больше вы играете с ними, тем больше вы подвергаетесь воздействию и тем больше опыта вы накапливаете. Если вам повезет жить в районе, где есть сообщество людей, заинтересованных в программном обеспечении, вы сможете учиться быстрее.

Не бойся того, чего не понимаешь

Изучение чего-то нового, что сложно, часто поначалу кажется трудным - если это кажется легким, то это может быть то, что вы уже знаете, или вы действительно не проверяете свои знания (гораздо проще прочитать о том, как решить физическую проблему, и подумать: «это делает смысл, чем решить проблему самостоятельно с помощью инструментов, о которых вы только что прочитали). Борьба может быть хорошим знаком - это означает, что вы действительно учитесь, и, сосредоточившись на выполнении подобных вещей, вам станет легче, когда вы станете лучше.

Я думаю, что в этом есть даже небольшое преимущество, которое могут иметь совершенно новые люди: когда я набираю немного опыта, становится легко и удобно просто делать то, что я уже знаю, как делать, а не узнавать что-то новое. Это может привести к застреванию на плато, где вы просто неоднократно делаете то, что вы уже знаете, как делать, как человек, который может играть только одну песню на гитаре и всегда просто играет эту одну песню. С новым человеком все сложно, так что это не вариант.

Изучение чего-то сложного в первый раз должно быть немного болезненным - вы должны привыкнуть к этому чувству, поскольку это хорошо и означает, что вы растете. Не позволяйте этому пугать вас, потому что вы не думаете, что вы достаточно умны. Так как есть так много всего, чему можно научиться, и много разных возможностей (просто на компьютерах есть такие вещи, как компьютерная графика, безопасность, машинное обучение, алгоритмы, мобильные устройства, сеть, инфраструктура и т. п.), С мышлением, позволяющим расти и выходить из своей зоны комфорта, чтобы учиться новому - очень важно.

Учимся программировать на практике

Научиться программировать, просто читая книгу о программировании, все равно что учиться прыгать с парашютом, просто читая книгу о скайдайвинге. Вам, вероятно, нужно прочитать книгу (и вначале она понадобится вам для начала), но она не сработает, если вы не пишете вместе с ней небольшие программы. Плотник становится лучше благодаря созданию вещей, писатель становится лучше благодаря написанию вещей, а программист - программированию. Это не означает, что вы не должны читать книги или что хорошие книги не являются чрезвычайно ценными (они есть), но что легко попасть в ловушку, где вы читаете книги о программировании, фактически ничего не делая сами, потому что легче читать об этом тогда нужно делать, и может быть трудно придумать что-то для программирования в вакууме, когда вы начинаете.

Я согласен с ESR, что Python - это хороший язык для начала, и в Интернете есть хороший сайт, который называется Learn Python - сложный путь, который ориентирован на новичков и в процессе обучения используются упражнения.

В начале синтаксис сложен для понимания, и много времени уделяется этому, когда вы учитесь. Поскольку каждый язык программирования имеет разный синтаксис, они кажутся очень разными. Затем вы начинаете понимать синтаксис, и это больше об общей структуре того, как решаются проблемы и какие структуры данных используются. В конце концов вы освоитесь с общими структурами данных, и затем обсуждение переходит к более высоким уровням абстракции и более общим проектам или инфраструктуре, которые упрощают управление в масштабе или в будущем их легче изменять.

Изучение структур данных является наиболее важным следующим шагом после того, как вы освоите синтаксис языка и сможете писать простые программы. Существует несколько основных структур данных, которые довольно подробно описаны в книге «Взлом кодирования» (наряду с примерами проблем). Заблуждение, что у языков, как правило, разные имена для реализации одних и тех же структур данных (например, Python называет хеш-таблицы «словарями»), но большинство языков будут иметь некоторую реализацию основных структур данных, даже если они имеют уникальное имя.

Устранение неполадок или отладка также является основным навыком программирования - большая часть программирования на самом деле отладка, поэтому, если вам нравятся проблемы с отладкой, это, вероятно, хороший знак. Не расстраивайтесь, когда вам приходится много искать, чтобы что-то понять, или когда документация, которую вы читаете, не работает, или когда вы сталкиваетесь с неожиданной ошибкой в ​​вашей среде - это нормально (это не так. не отражение ваших способностей).

Большая часть программного обеспечения не работает, и есть постоянно недокументированные ошибки, ошибки и мелкие детали, которые трудно исправить. Например, большинство проектов с открытым исходным кодом на Github будут иметь какую-то систему сборки, которая обрабатывает настройку программного обеспечения для работы. Это будет делать такие вещи, как получение зависимостей (другой код, который требуется для работы), наряду с выполнением любых необходимых команд для фактического запуска. Если вы скачаете интересный проект на Github и попытаетесь запустить его, вы, вероятно, столкнетесь с неожиданными ошибками в этом процессе, которые часто не документируются.

Обработка этих ошибок и работа с проблемами - нормальное явление, и опытным программистам тоже приходится иметь дело с этим (если нам повезет, мы только что видели подобные проблемы раньше). Я видел, как люди сталкиваются с такими ошибками и думают, что они делают что-то не так, но это не ты - это просто так. Существует множество конкурирующих инструментов и даже отраслей, занимающихся сборкой систем и пытающихся сделать их лучше (что может запутать новичков, поскольку нет реальной стандартизации, а правильный способ настройки программного обеспечения для работы зависит от среды программирования и языка). ).

Как на самом деле работает компьютер?

Я помню, как расстроился, что было трудно найти информацию о том, как на самом деле работает компьютер. Все, что я искал, просто говорило о компьютерах в бесполезных упрощенных аналогиях (диск был «шкафом для хранения файлов»), но я ничего не мог прочитать, чтобы понять, как все работает на самом деле, так что если я перенесусь в прошлое, я смог бы объяснить как построить один. Это скорее электротехника или компьютерная инженерия, чем программное обеспечение, но все же есть много смысла в понимании аппаратных аспектов (и это интересно!).

Лучшая книга, которую я рекомендовал бы для этого - Кодекс Чарльза Петцольда. Он познакомит вас с основами, начиная с электрических бит, вплоть до истории булевой логики и схемотехники - с реальными чертежами простых цепей и с тем, как вы можете хранить биты в памяти. Это основывается на историческом контексте открытий, пока вы не построите небольшой процессор. Он также занимается сборкой и базовой компьютерной графикой. Автор - действительно ясный автор и учитель, таким образом, книга удивительно читаема для количества деталей.

Для более исторического контекста я бы порекомендовал «Машину мечты» М. Митчелла Уолдропа и «Хакеры» Стивена Леви. Повествовательные истории облегчают изучение и запоминание вещей, и я думаю, что контекст открытий помогает понять, как все работает на самом деле.

Программные средства - редакторы кода, среды программирования

Инструменты - это весело, и хорошо знать ваши инструменты, но вы можете тратить целую вечность, настраивая вещи и споря о мелких деталях, которые на самом деле не имеют большого значения. Настройка инструментов может быть интересным способом изучения, когда вы только начинаете, но я видел, как люди тратят на это огромное количество времени, когда оно генерирует относительно небольшую ценность по сравнению с написанием программ для решения проблем или просто изучением ремесла программирования в целом (хорошим примером книги для этого в настоящее время является Проектирование Data Intensive Applications ). Я думаю, что слишком много внимания уделяется настройке инструментов, которые могут вас сдержать.

Не беспокойтесь о таких вещах, как Vim или Emacs, или о том, какую операционную систему вы используете - вы можете изучать основные навыки где угодно (это мое самое большое несогласие с постом ESR). Тем не менее, игра с Linux была для меня очень ценным способом узнать много нового о поиске и устранении неисправностей - в основном потому, что он не очень хорошо работал, и мне пришлось часами тратить время на такие вещи, как попытка заставить работать беспроводной интернет, заставить ноутбук работать. приостановить успешно, даже заставив интерфейс вообще отображаться (сейчас дела обстоят немного лучше).

Я начал с попытки установить Gentoo (который на самом деле не удался). Этот навык устранения неполадок действительно помог мне получить работу, которую я имею сейчас, поэтому, если вам интересно играть с другой ОС, я бы определенно поощрял ее, я просто не думаю, что это требование. Вероятно, легче учиться на macOS или Linux, поскольку большинство существующих инструментов предназначено для этих сред, и большинство программистов используют один из этих двух.

Одним из конкретных инструментов, заслуживающих упоминания, является контроль версий, особенно git. Стоит потратить некоторое время, чтобы освоиться с основами, но, вероятно, не на чем сосредоточиться, пока вы немного не программируете.

Не исследуйте вечно

Это легко откладывать на потом, «исследуя» варианты навсегда перед началом проекта - может быть интересно прочитать и изучить то, что доступно, и полезно немного поработать над этим, но вы также можете застрять, делая это навсегда. Если вы сомневаетесь, просто выберите самый популярный проект, который существовал некоторое время, и используйте его. Если он популярен, у него, вероятно, есть приличное сообщество, из которого вы можете поучиться, и если оно существует какое-то время, оно, вероятно, будет более стабильным (или, по крайней мере, будет более существенным и с меньшей вероятностью будет оставлено).

Компьютерная наука

Мне действительно нравилось изучать информатику, и я думаю, что это все еще лучший способ использовать большинство возможностей (особенно если вы живете в пригородной зоне, как я делал без большого количества программистов). Если это возможно, я думаю, что, вероятно, было бы хорошо попытаться войти в лучшую программу CS, которую вы можете. Есть также много классов, доступных из хороших онлайн-программ, но если бы ваша жизнь была такой же, как моя была в старшей школе, вам будет сложно воспользоваться этим дома.

Программирование Интервью

Если обучение является наивным решением для получения хороших оценок, то работа над классными проектами по программированию является наивным решением для достижения успеха в программировании интервью. Чтобы быть в хорошей позиции для программирования интервью в конкурирующих компаниях, вам нужно хорошо освоить проблемы, связанные с leetcode и книгой «Взлом кодирования» . Интервью по программированию требуют большой практики и являются самостоятельным навыком.

Вы можете пройти всю степень CS и все еще не знаете, как программировать - вы также можете получить степень CS и не иметь возможности проходить собеседования по программированию (оба из них, вероятно, используются по умолчанию). Научиться программировать и учиться хорошо программировать на собеседованиях требует целенаправленного времени самостоятельно. CS помогает с некоторыми направлениями и целенаправленными проектами (Lambda School, вероятно, лучше справляется с этим в области программирования и, возможно, в конечном итоге будет лучше в целом), но вам придется владеть большой частью этого обучения самостоятельно.

Роли и рабочие места

Есть много разных видов ролей, кроме «программиста». Есть SRE (Site Reliability Engineer), который больше ориентирован на инфраструктуру, на которой работает код, и написание программного обеспечения для этого. Есть внутренние инструменты и разработчики - разработчики, которые сосредотачиваются на всех инструментах, необходимых для автоматизации создания и тестирования программного обеспечения (прочитайте The Phoenix Project для забавной повествовательной истории, иллюстрирующей это). Существуют роли, которые больше взаимодействуют с пользователями, например, инженер поддержки разработчиков (помогая пользователям с API-интерфейсами и устраняя ошибки или проблемы с конфигурацией). Есть люди, которые сосредоточены на игровых движках, люди, которые сосредоточены на виртуальной реальности или компьютерной графике. Есть люди, которые пишут новые компьютерные языки и новые компиляторы.

В каждой из этих ролей есть еще больше специализации в зависимости от того, какие продукты используются, и новых инструментов, которые создаются для решения новых проблем. Компьютерная безопасность также является интересной областью, о которой я не знаю слишком много, и я думаю, что ESR слишком пренебрежительно относится к его посту, но это также трудное место для начала, потому что для этого нужно много понимания того, как все работает. как все может быть сломано. Я помню, как забирал эту книгу на ранних этапах, но в то время я не знал достаточно, чтобы по-настоящему понять ее: Взлом: Искусство эксплуатации

Конечно, есть также создание собственной компании и создание собственной роли в качестве основателя.

Есть чему поучиться (опять же)

Целая жизнь - это долгое время, а специализация не вечна, поэтому погрузитесь в разные вещи - играйте со многими новыми вещами и получайте удовольствие по пути.

Бонус: Сообщество

ESR говорит о присоединении к локальной группе пользователей Linux, но, по крайней мере, для меня это было нереально, когда я читал его пост, потому что их на самом деле не так много, и потому что я сам так легко никуда не попал, так как был слишком молод, чтобы водить. Есть некоторые онлайн-сообщества, которые мне кажутся интересными сейчас, и я думаю, что я тоже нашел бы их интересными.

Hacker News: новостной сайт Ycombinator (запуск инкубатора в районе залива). Комментарии можно ударить или пропустить, но хорошие действительно хорошие, и многие люди в индустрии тусуются там. Пол Грэм и Джессика Ливингстон были основателями Ycombinator, а Пол пишет много интересных очерков.

Twitter: в значительной степени зависит от того, за кем вы следите, но может быть отличным местом, если вы этого хотите. Может быть трудно узнать, кому следовать, чтобы начать, но вы можете посмотреть на всех, за кем я следую, для начала.

Менее неправильно: не сфокусировано на программировании, но между сообществом рационального подхода и сообществом программистов есть приличное совпадение, и мне нравится много написанного там, это определенно то, что мне хотелось бы найти примерно в то же время, когда я нашел Как Стань Хакером. Вот пример сообщения якак много: Оспаривание Определения

Контакты

У меня больше статей и книг, которые я полюбил: https://zalberico.com/about/.

Я помню, как ESR отвечал на какое-то электронное письмо, которое я отправил о том, чтобы заставить iPod работать в Fedora Core 4, когда я читал его пост, и я почти уверен, что Ричард Столлман также ответил на какое-то электронное письмо, которое я отправил в то время. Я думал, что это было хорошо. Не стесняйтесь обращаться ко мне с конкретными вопросами, если хотите.