История одного программиста

    Я программист, 24 года. Рост 170. Параметры 90-60-90. Хочу поделиться опытом с институтских времен. На что нужно обращать внимание в процессе обучения (исходя из моих наблюдений), что может пригодиться в будущем. Расскажу, в какие моменты и какой прогресс наблюдался. Как не опускать руки, если скучно учиться, и в чем искать мотивацию.

    image


    У меня в школе информатика была только в 10 и 11-м классах. Изучали мы язык QBasic. Писали программы не более, чем на 30 строк. На фоне остальных одноклассников вроде получалось неплохо справляться с заданиями, да и окружающие говорили, что «программисты сейчас нужны». Когда я шла учиться на программиста, не представляла вообще, что это такое.

    На первых трех курсах у меня всё ещё не было полного понимания и представления, чем буду заниматься. На первом и втором курсе были семестры с изучением языка С. Все остальные предметы заключались в ознакомлении с областями, которые помогут в программировании. Некоторые предметы отдельные товарищи не дооценивали, а зря.

    Проучившись в институте, осознаешь важность следующих вещей



    Coding style


    На первых двух курсах мои программы представляли из себя, не побоюсь слова, говнокод (когда я открывала старые программы на более старших курсах, то я сама была в шоке от оформления кода). Я видела на одной строке несколько вызываемых функций, операторы, и всё это могло писаться без пробела. С первого по четвертый курс преподы в основном только требовали от нас знания языка, применение изученных алгоритмов в решении задачи. Нам даже ничего не говорили о стиле программирования, а что студенту «работает же – не трогай». Всё изменилось с середины четвёртого курса. Когда мы более менее справлялись с поставленными задачами, преподаватели стали делать замечания по оформлению кода. У меня даже есть отчеты, исчерканные, со стрелочками и рекомендациями для изменения расположения кусков кода. «Чистота» кода на первых трех курсах у меня была почти на нуле. Но потом ты стараешься писать код должным образом, чтоб не стыдно было показать другим.

    Так что, не бойтесь показывать свой код более опытным программистам, вашим одногруппникам, не бойтесь критики, ведь лучше раньше осознать свои ошибки и научиться писать читабельный, грамотный код. Участвуйте в открытых проектах или хотя бы посмотрите, как пишут программы, например, на github. К тому же сейчас есть книги с рекомендациями по стилю написания кода, что может помочь привить «чистоту кода» уже на начальных стадиях обучения.

    Сделай свою жизнь проще – используй системы контроля версий


    Я впервые познакомилась с системами контроля версий на пятом курсе. И очень благодарна преподу, который заставлял нас вести разработку лабораторных работ в git. Познав все преимущества и гибкость распределенных систем, имея опыт работы с SVN и git, я отдаю предпочтение git. И даже не смущает работа в git bash, хотя существуют и графические приложения для работы Git-ом.

    Нужно изучать матчасть


    Многие не берут в счет некоторые предметы. Мол скучно, да и вряд ли мне это пригодится. Как показывает практика, это ещё аукнется. У большинства моих знакомых на собеседовании спрашивали именно то, что они упускали. Вот несколько вещей, знание которых мне пригодилось и не раз.

    Регулярные выражения


    У нас был целый предмет, на котором можно было оттачивать навыки по составлению регэкспов – теория компиляторов. Сначала мы писали простенькие лексические анализаторы, позже стали писать программки и для синтаксического разбора. После знакомства с регэкспами можно увидеть, что они нужны и для парсинга файлов, и для проверки корректности данных (тот же IP-адрес проверить). И да, любят давать на собеседованиях задания, связанные с регулярными выражениями.

    Архитектура ЭВМ


    Как же работает процессор, как выполняются вычисления, как работает память, обрабатываются прерывания и много другое. Знание о представлении чисел в машине, о процессе выполнения операций с числами в дополнительном/обратном коде однозначно пригодится любому программисту, работающему с компьютером или ПЛИС, микроконтроллером и т.п.

    Знание о работе ОС


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

    При изучении работы ОС и драйверов, впервые собирали ядро Linux, хотя раньше для меня это было чем-то загадочным.

    Аппаратные языки программирования


    Полезно для общего развития. Но пока в работе не особо пригодилось. Хотя нет: когда на лекции нам начали рассказывать об упакованных и неупакованных структурах, я задумалась, а есть ли такое в языке С. Да, я не знала, что есть такое понятие, как битовые поля.

    Теория автоматов


    И вот эта теория может пригодиться на практике. Например, если у вас какое-то длинное выражение в if, его скорее всего можно упростить с помощью карт Карно или другого метода минимизации булевой функции.

    Информационная безопасность


    Мне пригодились знания о расчете CRC-кодов для контроля целостности передаваемой информации при обмене. У нас была даже целая лекция о том, что это такое и как сделать правильный выбор полинома.

    Сети


    Знакомство с различными протоколами, с работой и видами конфигураций сети оказалось полезным.

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

    Отсутствие мотивации может отбить желание учиться


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

    Чтобы внушить чувства другим, вы сами должны быть поглощены ими. Чтобы вызвать слезы у других, вы сами должны заплакать. Чтобы убедить других, вы сами должны верить.
    (Уинстон Черчилль)

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

    Что бы сказать напоследок


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

    Комментарии 35

      +6
      не знаю как у других, мне в жизни пригодилось ВСЕ что я когда-то учил в школе/универе/вне. И еще больше необходимо то, что не учил. Схема проста, чем больше знаешь, тем проще писать)
        –1
        Спорное утверждение. Модель универсальности и узкой специализации в разной степени эффективны. В задачах криптографии человек математической практики будет эффективней опытного многопрофильного программиста. Нужно учить не все подряд, а то что нужно\интересно. Говоря про университеты, не раз умные люди говорили что система образования не идеальна. Сейчас делаются шаги вперед, когда первые два курса, общеобразовательные базовые знания, которые нужно изучить чтоб определиться какое направление в дальнейшем тебе будет интересно, а 3+ уже идет более узкая специализация по выбору студента.
          +3
          Модель универсальности и узкой специализации в разной степени эффективны

          Согласен. Я ведь и не говорил что мне пригодилось все именно в профессиональной деятельности, я утверждал, что мне пригодилось все в жизни. Это те самые 2/3 суток вне работы ;-)
          Но ведь согласитесь, всегда здорово, когда человек делает крутые математические выкладки, к примеру, показывая атаку на RSA при близких p и q, и не спрашивает как установить openssl в винду или как поставить SSL сертификат в nginx && postfix ?


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


          Я считаю, что программеру должно быть до лампочки на чем кодить, а вот предметную область изучать приходится под каждый проект. Пишете софт связанный с кораблями? Извольте понимать что такое дедвейт и валовая вместимость, ИМО и MMSI. Пишете САПР? Извольте понимать чем отличается PDIP от SOIC и почему к реле дорожки разной ширины.


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


          ЗЫ: Я думаю, Вы и сами понимаете это. Предлагаю сильно воду не лить ;-)

            +1
            и не спрашивает как установить openssl в винду или как поставить SSL сертификат в nginx && postfix ?

            Вы наверно добрый человек и не посылаете курить мануал когда к вам подходят с такими вопросами.

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

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

            В целом я с вами согласен.
              0
              Я что хотел сказать то
              Схема проста, чем больше знаешь, тем проще писать
              это справедливо только для последнего примера что я написал. А когда задача серьезная там базовые знания не спасают всё равно приходится много курить, осваивать…
        +4
        Нужно изучать мать-часть
        Можно начать с изучения того, что означает слово «матчасть»
          0
          Матан-часть, вот чего часто нехватает )
          +5
          Универские знания бывают полезны, если они а фундаментальном уровне. Мне в универе рассказывали и про всякие мьютексы, прерывания, регэкспы, процессы, и многое другое, но полезность всего этого я осознал только когда началось более-менее активное использование всех этих примитивов. Вот тогда я и стал резко перечитывать всякие книжки вроде «Современных операционных систем» Таненбаума. До того момента они висели где-то далеко, в виде некоторой магии, которая непонятно кому нужна.
            0
            Просто преподать знания и не об'яснить как они могут быть использованы. Что может быть бесполезнее?
            –2
            Имхо институт полезен только тусовкой себе подобных. Преподаватели и материал давно устарели.
              –5
              > После знакомства с регэкспами можно увидеть, что они нужны и для парсинга файлов,
              > и для проверки корректности данных (тот же IP-адрес проверить).
              Это как раз два типичнейших примера когда _ни в коем случае не нужно использовать регулярки_.
                +1
                Поясните почему
                  0
                  Возможно вопрос и дурацкий, но таки почему? ИМХО как раз для этих задач регулярки подходят почти идеально.
                    0
                    Потому что нечитаемо, неподдерживаемо, и вам повезёт, если файл описывается регулярной грамматикой.

                    Комбинаторами парсить получше.
                      0
                      Ну и файлы имеют свойство меняться в самый неподходящий момент. Лексер тут же вскочит на защиту с сообщением: «вот тут поломалось», а регулярка в лучшем случае просто отдаст пустой результат.
                        0
                        Ок, согласен, в случае с файлами действительно лучше работать не регулярками. Но IP-то чем не провинились? Идеально описываются регуляркой, как впрочем и номера телефонов или любые другие жестко стандартизированные данные.
                          0
                          Идеально ли? ping 127.1 работает, не смотря на его непохожесть на IP. И это не единственный способ задать валидный IP. Впрочем, та же фигня и с номерами телефонов (стандартов там больше одного, не считая региональных особенностей). Единственное в чём вы можете быть уверены — в нём должны быть цифры.
                            0
                            > или любые другие жестко стандартизированные данные
                            В реальном мире жестко стандартизированных данных не существует. Точка. Ну, если вы хоть как-то привязаны к бизнесу, а не пилите какой-нибудь эмулятор восьмимерного марсохода в вакууме.

                            Регуляркой можно выдрать все цифры из телефонного номера, это правда. Но _проверять_ что бы то ни было регуляркой нельзя. Запомните это, и расскажите всем знакомым. Я очень хорошо умею регулярки, и пока не стал действительно гуру, пихал их куда ни попадя. Теперь — вымарываю отовсюду.

                            Вот вам ссылка прикольная на закуску: https://regexcrossword.com/
                      0
                      Ну тогда проверка почты, телефона, адресов и тому подобного. Скрапинг. Файлы норм, если скорость написания кода важнее и необходимо обработать небольшой набор данных, вытащить нужное — вполне нормальный способ.
                      +2
                      В универе мы учим computer science, а работаем как software engineer. Отсюда и впечатление, что в универе дают много ненужного. Дают нужное, просто немного для другой сферы.
                        0

                        Тогда надо было теорию давать на уровне науки а лабы — строить так, чтобы студенты дёргали-подергивали мозжечком и активно пользовались тем, что услышали на лекции: т. е. лабы д. б. очень жестко привязаны к официальной версии лекции по предмету — вплоть до ссылок в задаче см. стр. 14622...

                        0
                        По-моему, идеальный вариант обучения для программиста — пару лет азов + обзорные курсы, и идти работать, по ходу работы проходить специализированные курсы по тому, куда занесло, с отдельными сертификатами, так и работодателям будет намного проще понять, на что подходит человек.
                        Но у нас железобетонная система высшего образования, с обязательными учебными планами, да еще привязана к отсрочке от армии, без капитальных реформ ничего не изменишь.
                          0
                          Да, преподавать можно по разному. Помню, на первом курсе университета на самой первой лекции был предмет «информатика», и нам сразу же предложили написать программу для вычисления определённого интеграла на языке С++. Некоторые студенты не знали, где на клавиатуре находится символ "%". Математический анализ мы тогда ещё не успели посетить первую лекцию. Интеграл как взять не представляли даже на бумаге. И никогда не знали о существовании языка С++. Видимо, препод был не очень адекватный, предлагая такое. Ну, потом уже я купил книги Шилдса и других гуру. А также изучил компилятор от борланда. Интерес к программированию возник сам, не от необходимости выполнения заданий. И жалею, что не хватает времени заниматься этим системно. Ведь если бы я занимался языком 5 лет, к примеру, сейчас я был бы хорошим программистом. Цитата в рамочке в начале статьи уместна и актуальна.
                            0
                            >> Ведь если бы я занимался языком 5 лет, к примеру, сейчас я был бы хорошим программистом

                            Вы были бы неплохим джуниром (стажером по-русски). Без практического опыта в продакшене не стать хорошим программистом.
                            +1
                            Самое скучное в университетской программе — это теория разработки компиляторов. В отношении неё сильнее всего ощущение, что уж это мне точно никогда не понадобится, поскольку компиляторы я уж точно разрабатывать не буду. А в результате оказывается, что умение правильно писать парсеры — это наиболее ценный и практически полезный навык. Всё остальное можно относительно легко нагуглить, а вот настолько фундаментальные знания за десять минут не нагуглишь… нужно читать толстые книги… а времени на это всегда не хватает. И это при том, что парсеры приходится делать постоянно. Есть даже такая присказка: какую бы программу программист не разрабатывал, при достижении определённого уровня сложности его программа превращается в парсер, вокруг которого уже выстраивается всё остальное.
                              0
                              Согласен, это справедливо для программирования, сколько потрачено ненужного времени в институте — самому можно научиться большему, востребованному и актуальному в n'ое количество раз. Преподаватели зачастую не могут внятно объяснить, а преподаваемые дисциплины уже неактуальны.
                                0
                                На первых двух курсах мои программы представляли из себя, не побоюсь слова, говнокод (когда я открывала старые программы на более старших курсах, то я сама была в шоке от оформления кода).

                                Если бы «говнокод» был «говнокодом» только из-за плохого оформления, жизнь была бы намного проще…
                                  +1
                                  ну да, + изобретенные велосипеды, вместо которых можно было сделать всё намного проще.
                                  Но поскольку на первых курсах особо серьезных программ не пишешь, то оформление бросается больше всего
                                  0
                                  Хорошая статья, благодарю.
                                  Можно поинтересоваться, где вы учились?
                                    0
                                    Московский Авиационный Институт
                                    0
                                    На опыте не могу согласиться со всеми утверждениями. Несомненно польза есть, но лично у меня эффективность образования вызывает сомнения. Считаю, что материал «по теме» пройденный за 3 года обучения, при большом желании мог бы быть изучен гораздо быстрее.
                                      0
                                      Когда осознаешь необходимость в конкретных знаниях, то изучение действительно нужного материала происходит намного быстрее.
                                      У одной знакомой брат вообще не имеет диплома, но спустя многих лет самообучения, большого опыта фриланса, он работает в очень достойной компании.
                                      Всё написанное мной не претендует на «абсолютную истину». Все зависит от человека, его жизненной позиции и других факторов.
                                        0
                                        Мог бы быть изучен гораздо быстрее? Мог бы, если толь знать что и как изучать. Вообще в институте/университете учат только тому как всю осташуюся жизнь учиться, учиться и трудиться. Что касается программистов, то когда я общаюсь с претендентами, я задаю классические вопросы:
                                        — что такое fork, pipe, pid?
                                        — какаю и когда купил последнюю книгу?
                                        — какую книгу сейчас читаешь?
                                        И от получаемых ответов понимаешь, что за программист стоит/сидит перед тобой.
                                          +1
                                          Я думал умению учиться учат в школе, по крайней мере так говорили в школьные годы. Я обозначил, что мнение основывается на личном опыте.
                                          моя история
                                          Работать по специальности я начал на 2 курсе (уровень знаний после школы был на уровне «умею переустановить виндовс»), пропуская большинство занятий (индивидуальное посещение), я закончил университет на отлично (коррупции в университете не было), и к выпуску уже сменил две работы (потому как поступали более интересные предложения). Я успешно прошел все собеседования на которых был, но не потому что все знал, а потому как дал понять, что знаю где искать. Во время учебы нередко приходилось спорить с профессорами, которые преподавали не совсем актуальную информацию и никогда в глаза не видели реальных условий ведения проекта.

                                          Извините, но я считаю, что ваши вопросы не оценивают компетенции претендента, как программиста. Программист не википедия, а средство для решения задач.
                                        0

                                        Мне не нравилось, что часто в институте было больше теории, без практики. Было не ясно где и какие знания можно применить. И из-за этого знания было сложнее понять, изучить, запомнить, применить где нужно.

                                        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                        Самое читаемое