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

Да, пора поговорить о кроличьих норах.

Прежде чем я действительно погрузиться, я должен кое-что прояснить о себе. Несмотря на то, что я провел неисчислимые часы своей жизни за компьютером, я всегда был дилетантом. Я не мастер программирования-самоучка, который пишет на ассемблере с десяти лет. Я никогда не модифицировал код игры ради развлечения, не разбирал машину и не собирал ее обратно. Raspberry Pis и Arduinos меня пугают. Да, я раньше посещал курсы программирования, и да, я боролся и гуглил свой путь через некоторые острые проблемы и возился с виртуальными машинами и Linux здесь и там, но никогда не надолго. Меня это смущает, потому что технари всегда были Моими людьми. Окружающие меня люди всегда были компетентны, любопытны и разбирались во всех технических вопросах. Мне? У меня было достаточно информации, чтобы быть приличной, но вместо этого я ухмылялся, кивал и позировал на своем пути в те редкие моменты, когда я действительно делал что-то более техническое, чем посещение Reddit.

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

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

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

Сборка ПК в одиночку

Сборка ПК была первой кроличьей норой, поскольку вплоть до курса Введение в ИТ в прошлом месяце я на самом деле не знал, как выглядит материнская плата и куда крепятся различные компоненты. Поскольку такие названия, как AMD Ryzen 7 2700X и RTX 2070, были только шумихой, я сделал то, что сделал бы любой предприимчивый студент, и попросил незнакомцев и друзей собрать для меня компьютер. После того, как Интернет предоставил первоначальную сборку, мои всегда терпеливые друзья объяснили мне, что дополнительные 20 долларов за RGB в ОЗУ были просто цветом, который меня не заботил; что, несмотря на то, что я слышал раньше, AMD теперь крута; и что да, не все твердотельные накопители одинаковы. Вооружившись новыми кладезями знаний, я слепо следовал всем рекомендациям, откинулся на спинку кресла и стал ждать прибытия моего нового приза.

Все уверяли меня, что собрать его было довольно просто, поэтому я загрузил видео на YouTube и начал установку около 11 ночи. Сначала паника охватила меня, когда я держал 300-долларовый процессор над местом, которое, как я был уверен, он подойдет, и продолжилась, пока я неуверенно прижимал к нему вентилятор радиатора, отчаянно надеясь, что он правильно прикрепился, и продолжала хватать меня каждой дорогой штукой, которую я схватил, и каждой винт, на котором я разрушил резьбу. Второй худшей частью было смотреть на ряды нетронутых контактов, затем вставлять в них разъем за разъемом и скрещивать пальцы, чтобы убедиться, что каждый кабель подключен правильно и ни один контакт не сгибается. Но хуже всего был жесткий диск. Никто не сказал мне, видите ли, что он прикреплен к материнской плате. Там я был с этим прямоугольником за 150 долларов, достаточно маленьким, чтобы его можно было проглотить, и искал место в моем чемодане, чтобы установить его.

Я бы продолжал искать, если бы мой многострадальный друг не сжалился и не обвел полезное место на моей материнской плате. Оттуда я начал с того, что как бы робко поставил SSD на место, думая «нет, это не может быть правильно», просмотрев несколько видео на YouTube в качестве руководства и поморщившись, когда я втиснул его красиво и плотно.

Тем не менее, так или иначе, прогресс все-таки пришел, и, наконец, я разобрался с кучей кабелей, безуспешно пытался подключиться к монитору одним из них и остановился на хорошо знакомом кабеле HDMI. Подключить к материнской плате…? Нет, попробуй видеокарту. Успех. К моему удовольствию и легкому удивлению, мой телевизор даже работал как монитор. Мой вентилятор процессора удивил меня, загоревшись всеми цветами радуги, когда я включил его, а мой компьютер удивил меня, быстро мелькнув на экране, а затем сообщив, что у него нет операционной системы для загрузки. Не волнуйтесь, я не настолько небрежен, чтобы думать, что операционная система будет предустановлена ​​— я просто достаточно беспечен, чтобы предположить, что мне нужно куда-то автоматически упорядочивать вещи. Еще один момент, когда я ползаю к моему святому другу за помощью, и напоминание о том, что ничего не сломано, и если я заспамлю удаление или f12 или что-то еще на этом экране быстрого изображения, все сработает. Еще раз, он предоставил несколько хороших фотографий, чтобы успокоить меня. В очередной раз все получилось.

Линукс. Я бы сначала установил Linux на свой компьютер и как следует к нему привык. Вернемся к моему другу: Мята, в которую я раньше окунул пальцы ног? Убунту? OpenSUSE? Дебиан? Таинственный Arch Linux, которым пользовался мой друг и который напомнил образы архи-личей и суровых хакеров, компилирующих через пустыню? Разум победил амбиции, и я остановился на безопасной почве Ubuntu. Установка прошла гладко, подключение к сети прошло… ах, сети нет. Wi-Fi не обнаружен? Столкнувшись с таким препятствием, ко мне нахлынули воспоминания о каждом маленьком разочаровании и незнакомстве с Linux, и даже цветовая схема показалась вдруг невыносимо уродливой, поэтому я стер диск и снова попробовал с Mint. Тот же результат, так что я в отчаянии опустил руки и полез обратно в Windows с помощью бесплатного студенческого ключа.

Именно тогда я наконец узнал, что не каждая материнская плата имеет встроенный адаптер WiFi.

Послушай, я предупреждал тебя о моей некомпетентности.

Однако у меня был один поблизости, поэтому, как только я понял проблему и очутился на знакомой территории Windows, все наконец стало гладко. Да, это плавное плавание действительно включало в себя резкое изменение разрешения моего телевизора и потерю всего подобия качества изображения, как только я подключил другой монитор, не говоря уже о покупке пары кабелей, которые мне не нужны, прежде чем получить полезный. Однако это сработало после нескольких поисков в Google. И да, это потребовало использования удлинителя WiFi, когда мой сосед по комнате перенес маршрутизатор вниз. Однако там я был в восторге как от простоты его использования в качестве продукта, ориентированного на массы, так и от моего нового понимания его словарного запаса из более раннего курса (802.11ac! AC2200! WPA2! MU-MIMO! Все уже не так загадочно) . И конечно, до сегодняшнего дня мне так и не удалось изменить этот веер от его радужного свечения. Знакомые, безопасные проблемы, все до единого. В конце концов, несмотря на всю мою панику и ошибки… процесс сборки был довольно простым, и в результате я получил блестящий новый компьютер! На несколько драгоценных мгновений я почувствовал послевкусие успешного проекта и понял, почему люди возятся со всей этой компьютерной ерундой.

Затем я закончил свой курс по базам данных и обнаружил за ним скромный курс под названием «Операционные системы для программистов».

Повторное знакомство с Linux

Первое, что я заметил в «Операционных системах для программистов», это то, что вся предварительная оценка была полна сложных технических деталей, о которых я почти не имел ни малейшего представления.

Второе, что я заметил, это то, что мне все-таки нужно будет установить Linux, на этот раз на виртуальную машину.

Третье, что я заметил, это то, что учебник состоял из 760 страниц вместо 200, как в моих предыдущих текстах, и был изложен как-то запутанно.

Четвертой и пятой вещью, которую я заметил, были динозавры на обложке учебника, так что это, по крайней мере, меня обнадежило.

Так или иначе, после нескольких откровенно приятных прогулок с HTML и SQL на моих первых двух занятиях я внезапно столкнулся лицом к лицу с плотным техническим курсом, полным всех подробностей об операционных системах, о которых я никогда не думал, что не хочу знать: процессы и потоки, и удаленные вызовы процедур, и пыль, и грязь.

Этот раздел не об этом курсе. Я все еще катаюсь в грязи, поглощая всю информацию, которую могу, и убегаю, чтобы Делать На самом деле Что-нибудь Еще в любой возможный момент. Нет, этот раздел посвящен одной конкретной части этого курса: написанию моей первой настоящей программы за последние три года. Видите ли, курс, проводимый моим университетом, фокусируется на знании понятий с помощью теста с множественным выбором, но в учебнике было несколько очень рекомендуемых упражнений по программированию, и я чувствовал себя странно и глупо, не помня, как делать какие-либо из них, поэтому я решил сделать то, что это Взял, чтобы хотя бы начать ковыряться в коде. Это было, ну, немного пугающе. Конечно, я мог бы внимательно изучить пример кода, довольно быстро вспомнив, что * перед переменной C указывает на указатель, найдя, что означает & перед другой переменной после некоторого безумного поиска в Google, в основном, но не полностью следуя логике после немного больше Google для хорошей меры. Хотя писать свои собственные?

Я никогда прежде не писал ни строчки кода ни на C, ни в Linux. У меня не было ни малейшего воспоминания, где я должен был это написать, как его составить, как сделать действительно что-нибудь полезное. Все это звучит тривиально для любого программиста, читающего это, но когда вы находитесь внизу и смотрите вверх, легко столкнуться лицом к лицу с дюжиной отдельных кривых обучения одновременно, где даже «тривиальное» быстро закручивается в поразительных направлениях. Бродить по Google в поисках помощи одновременно и воодушевляет, и обескураживает: да, каждый ответ доступен, но все, кто отвечает, кажутся седыми волшебниками с энциклопедическими познаниями в тайных искусствах, раздающими намеки на обычные и неясные, темные ритуалы, кропотливо приобретенные благодаря многовековому опыту работы с всем.

Ладно, это может быть преувеличением, но трудно не чувствовать себя немного хуже.

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

Значит, сверху. Мой курс рекомендовал использовать гипервизор VMWare и закинуть на него виртуальный дистрибутив Linux. Это первая задача. Осталось запустить линукс. Должно быть просто, да? Просто используйте VMWare и копию Linux Mint, которую я ранее пытался настроить, нажмите несколько кнопок, поймите, что Mint не включен в параметры по умолчанию, и… ах, да, было одно из сообщений об ошибках, которые я так пропустил в Google. Кое-что о несовместимости с «Credential Guard» в Windows 10. Я ковырялся в нескольких предложенных настройках, не мог заставить его работать, что бы я ни делал, а затем смутно вспомнил из своего последнего курса, что в Windows есть встроенный в одном под названием Hyper-V. …который был выделен серым цветом в моих настройках, потому что ((больше погуглить))… мне нужно было включить некоторые настройки в моем BIOS.

Неисправность. Поковыряйтесь в БИОСе. Не найти настройки. Информация о материнской плате Google. Найдите пару подсказок. Еще раз поковыряйтесь в БИОСе. Нет настройки. Оптимистично щелкните пару других настроек. Нет игральных костей. Снова проверьте в Интернете, наконец, я понимаю, что могу найти этот параметр в BIOS, найти его и — успех! Hyper-V был разблокирован, и я снова ощутил мгновенный трепет триумфа, который успешно вынудил меня продолжить. Поэтому я установил на него Ubuntu, наблюдал за его автоматической настройкой, потому что я, наконец, использовал более распространенный дистрибутив Linux, и уверенно вошел в свою новую виртуальную машину, чтобы найти приятный ответ на мой предыдущий опыт установки Ubuntu: беспроводной сигнал не распознан. Поиск в Google и поиск настроек в гипервизоре настолько утомили меня, что я удалил все это и еще раз вернулся к VMWare.

…и вдруг все заработало идеально, и снова наступил тот трепет удовлетворения и успешной борьбы.

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

Я держал это в страхе, но на самом деле я действительно намеревался изучить это все пять лет назад. Все то, что было в предыдущих курсах о сетях и базах данных, было приятно новым, но теперь, когда у меня был установлен Linux и я играл в терминале, я вспомнил времена, когда использовал его раньше. Я смутно вспомнил некоторые команды для навигации по файловой системе и набрал экспериментальные cd.., ls, а затем множество других команд. Я вспомнил, как слышал разговоры о пугающе звучащих текстовых редакторах, таких как Vim и emacs, даже об использовании Vim для курса биоинформатики, вспомнил, что был доволен им, потому что он использовал ту же забавную схему управления, что и игры, на которых я вырос, и вспомнил (чтобы моя детская радость) что все, что мне нужно было сделать, чтобы установить его, это открыть терминал и ввести… что это было… vim и следовать приведенным оттуда инструкциям.

Что я забыл, так это то, насколько отличается интерфейс Vim от, скажем, Блокнота или Microsoft Word. С моим упором на скорость в моих предыдущих курсах и в какой-то степени в учебнике этого курса, помня, что мне придется заново ознакомиться с необычной (но, как мне обещали, невероятно эффективной!) схемой управления, прежде чем даже начать программировать. словно врезаться головой в очередную кирпичную стену. По крайней мере, у этой кирпичной стены, в отличие от чепухи с гипервизором, был обнадеживающий и веселый туториал. И я должен был признать, что изучал и запоминал кое-какую забавную информацию, например, тот факт, что я мог скомпилировать и запустить код, написанный в Vim, набрав всего две или три строки. Не выходя из редактора, даже мышь не нужна. Еще одно небольшое волнение от этого вдохновило меня на то, чтобы немного погуглить, а затем написать простое «Hello world».

Никаких ошибок! Все работало! Терминал мягко напомнил мне sudo apt-get install gcc, когда я пытался скомпилировать C, не загружая компилятор, но это тоже было удобно и полезно. Время для собственно упражнения, чтения из одного файла и записи в другой. Базовые вещи, наверное.

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

Программирование для Wannabe Script Kiddies

Каждый. Шаг. Из. . Способ. Является. Боль.

Просто вывести строку текста очень просто.

Как насчет ввода данных пользователем, поскольку мне нужно, чтобы пользователь дал мне два имени файла? Немного поиска в Google подсказали мне использовать команду gets(), поэтому я попробовал ее только для того, чтобы мой компилятор сказал мне, что это опасно, погуглил еще немного и вместо этого попробовал fgets(). Это было хорошо и, похоже, сработало, поэтому я решил немного поиграть (простыми, ограниченными способами) и на самом деле вывести результаты обеих текстовых строк в предложении.

Некоторые фрагменты кода, которые я попробовал, идеально расположены, чтобы заставить программистов корчиться. Если вы не программируете, просто представьте себе пожар в мусорном баке и глазурь прямо за ними:

printf(“\nYou’re copying%s”,inputFile” to %s”,outputFile”.”)

и когда это ужасно провалилось,

printf(“\nYou’re copying”); puts (inputFile); printf(“ to “), puts (outputFile); printf(“.”);

который был уродливым kludge, но вроде работал. Это показало мне, что команда puts() необъяснимым образом добавляет новую строку после нее, что приводит к такому прекрасному результату:

You’re copyinginputFile
 to outputFile
.

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

А затем, через некоторое время 2 часов ночи возиться с этой глупой программой, все вдруг просто заработало. Все встало на свои места. Мир был в покое. Как и в тот момент, когда мой компьютер был собран, как и в тот момент, когда я запустил виртуальную машину, я испытал волнение и удовлетворение. Я сделал программу. Это было мое, и я мог возиться с ним, читать и записывать файлы и обрабатывать по крайней мере несколько ошибок, и это работало.

Подождите, однако, пришла непрошеная мысль. … разве настоящие программисты не загружают на github? И эй, разве они не используют волшебство командной строки для автоматической загрузки? Насколько сложно учиться в 2 часа ночи? В конце концов, у меня все еще была учетная запись на github, созданная много лет назад, когда я собирался все изучить, оптимистично сидящая с нулевым количеством коммитов за полвека.

Послушайте, в данный момент было бы излишним рассказывать вам о моих проблемах с ssh-ключом. В этот момент, услышав, что мне пришлось задавать безумные вопросы о моем жестком диске в течение получаса, паниковать из-за моего BIOS, потому что мой загрузочный экран двигался слишком быстро, и бороться с моим гипервизором на земле, чтобы начать установку Ubuntu, а не говоря о каждой небольшой проблеме с Vim и C, вы точно знаете, что произошло, когда я попытался создать ключ ssh и связать его с github. Мне не нужно рассказывать вам о полудюжине поисковых запросов, которые я выполнил по вариантам "отказано в доступе на github (publickey)" или "у агента ssh нет удостоверений". Вы уже можете догадаться, что я столкнулся с проблемами создания ключа, активации ключа, копирования ключа и даже понимания того, что это был за ключ. И, конечно же, не будет сюрпризом узнать, что даже после того, как я бросил несколько обнадеживающих строк о копировании в буфер обмена в мой файл Vim RC, я не мог в жизни понять, как на самом деле скопировать текст из Vim, чтобы вставить куда угодно. внешний. Отступление, поджав хвост, к LibreOffice, где простые Ctrl+C и Ctrl+V работали как положено, было действительно почти неизбежным.

После всего этого, однако, вот еще кое-что, что, я надеюсь, не станет сюрпризом: в конце концов, когда часы решительно приближались к 3 часам ночи, я отправил свои первые строки на Github, загрузив свои первые программы для Linux, полностью написанные на C. в первый раз и в Vim впервые за полвека, с терминала Linux внутри виртуальной машины, которую я установил на единственный компьютер, который я когда-либо создавал, через сеть Wi-Fi, которую я только что расширил, и сделал еще один шаг ближе на самом деле иметь возможность создавать инструменты, о которых я мечтаю.

И да, вы могли указать, что я лихорадочно удалил фрагменты кода из моей псевдонимной учетной записи GitHub через несколько секунд после публикации, потому что я не понимал, что общая фиксация будет ссылаться на мое настоящее имя, но это не главное.

Вывод

Оглядываясь назад, можно сказать, что большая часть того, что я делал, было довольно легко, а если и не было, то потому, что я подходил к вещам в довольно неправильном порядке. Но это было похоже на обряд посвящения, ныряние во все эти кроличьи норы и воспоминания о триумфах и разочарованиях, связанных с какими-либо практическими действиями с компьютерами. Что еще более важно, это четкое напоминание о том, насколько отличается теоретическое обучение от практического, поскольку предположения обнажаются, а простые шаги резко превращаются в часовые процессы. Мне кажется, что я стою на вершине огромной конструкции знаний, пробираясь сквозь края. Делая такие вещи, по крайней мере, некоторые из этих знаний кажутся реальными.

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

До скорого.

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