Немного фона
Мне сегодня 28 лет, и у меня никогда не было формального обучения по разработке программного обеспечения, но у меня есть две степени высшего образования, эквивалентные степени бакалавра по связям с общественностью и Executive MBA, ориентированных на управление проектами. Я работал на этих полях в общей сложности около 6 лет, 2,5 года назад я уволился / потерял работу и решил сменить направление.
После месяца обдумывания я решил заняться фрилансингом, разрабатывая небольшие веб-сайты в WordPress. Я сам научился этому, и сегодня я могу сказать, что управляю скромными, но успешными карьерными разработками тем и плагинов с нуля для своих клиентов - в основном, агентства аутсорсингуют некоторые из своих разработок для средних и крупных сайтов.
Но иногда я просто чувствую, что отсутствие достаточного изучения математики или формального понимания вещей действительно удерживает меня, когда мне приходится конкурировать или работать с более опытными разработчиками. Я постоянно ищу способы узнать больше, но мне, кажется, не хватает основ.
К сожалению, провести еще 4 года в области компьютерных наук сейчас не вариант, поэтому я стараюсь извлечь все возможное из книг и онлайн-ресурсов. Этот метод никогда не заставит НАСА нанять меня, но мне сейчас все равно. Моя цель - сначала пройти планку и быть в состоянии назвать себя настоящим программистом.
В настоящее время я провожу свободное время, изучая Java для программистов (чтобы овладеть языком, который все считают трудным / требовательным), читаю выдержки из Code Complete (чтобы овладеть передовыми методами), а также Code: The Hidden Language of Computer Аппаратное и программное обеспечение (чтобы понять внутреннюю работу компьютеров).
TL; DR
Итак, моя текущая ситуация такова: я в основном способен написать любую полную систему на PHP (с помощью Google и нескольких книг), интегрировать Ajax, SQL и еще много чего, и, возможно, немного медленнее, чем ожидал бы опытный разработчик из-за всех исследований.
Но вчера я оказался в затруднении, пытаясь найти (не Google) решение для теста FizzBuzz, потому что у меня не было запомненного оператора модуля if($n1 % $n2 == 0)
метода .
Что бы вы предложили в качестве хорошего способа решения этой дилеммы? Какие предметы / книги я должен изучать, чтобы я мог быстрее решать проблемы и, возможно, более "по-программистски"?
РЕДАКТИРОВАТЬ - Кажется, было некоторое замешательство о том, что я не знал, чтобы решить FizzBuzz.
Возможно, я не выразил себя правильно: я знал шаги, необходимые для решения проблемы. То, что я не запомнил, был оператор модуля. Проблема заключалась в переносе базовой математики в программу, а не в знании базовой математики.
Я взял тест для удовольствия, прочитав об этом на Coding Horror . Я просто решил, что это хорошая линия сравнения базовых показателей между мной и формально обученными разработчиками.
Я просто использовал это как пример того, как если бы я не занимался математикой в компьютерной среде, я терял время на поиск таких базовых вещей, как операторы модулей, чтобы иметь возможность решать простые задачи.
I'm basically capable of writing any complete system in PHP (with the help of Google and a few books)
и объединяю это с тем, что вы не знаетеif($n1 % $n2 == 0)
, я удивляюсь тому, как вы знакомы с вещами, написанными на PHP. Я думаю, что большинство вещей, которые вы делаете, выходят за рамки простого вычисления по модулю. Не могли бы вы дать больше информации о том, что, по вашему мнению, вы можете сделать?stuck b/c I didn't memorize %
проблемы, то стоит отметить, что есть и другие способы сделать это: (при условии, что $ n2! = 0)if (is_int ($n1 / $n2))
илиif (($n1 / $n2) == (int) ($n1 / $n2))
Знать ключевые слова - это одно, а знание того, как выразить основные идеи в отсутствие встроенного решения, - это одно. еще один.Ответы:
В вашем случае, когда вы самоучка и у вас уже есть хороший, здоровый и неприличный подход к обучению. Еще несколько предложений ...
Практика делает совершенным
Я думаю, что вы должны погрузиться в упражнения по программированию, такие как:
Даже возьмите прошлые вопросы об экзаменах известных университетов вокруг вас, или местных (или дистанционных) соревнований по программированию. Например, у нас во Франции есть хороший пример для начинающих программистов из средней школы, который называется Prologin , и он предлагает каждый год хорошую серию головоломных головоломок (возможно, только по-французски, хотя, извините, но я имею в виду именно такие вещи) ).
Для получения дополнительной информации: Где я могу найти головоломки и проблемы программирования?
Классические книги и справочники
Мы также могли бы порекомендовать очень длинный список удивительных книг , но я бы сказал, что ответ дзен в том, что нет единого правильного пути к Просветлению.
Было бы трудно сказать вам, какие из них являются главными в списке. Так что продолжайте читать тонны материала, чтобы узнать общие подводные камни, которых следует избегать, и лучшие практики, которым вы должны следовать, как вы делаете правильно сейчас.
Для большего:
Раздвигая границы
Кроме того, ищите царапающий голову материал, такой как:
Не обязательно быть примером того, что нужно делать в наши дни, но стоит попытаться выяснить, что, черт возьми, там происходит.
Peer Systems являются мотивационными
Вы также можете скрыться (и принять участие) в следующих сообществах, чтобы постепенно улучшать свои навыки, сталкиваясь с другими.
Заочное обучение
Если у вас нет времени или мотивации для участия в другом 4-летнем курсе или в чем-то подобном (что может даже не быть необходимым или полезным в любом случае и дорогостоящим), вы можете рассмотреть возможность поиска учебного материала в Интернете. Конечно, они не ограничиваются информатикой.
Благодаря первоначальным усилиям MIT OpenCourseWare , сейчас существует множество университетов, которые последовали их примеру , и вы можете найти много материалов для курсов университетского уровня бесплатно. Не всегда легко ориентироваться и читать его самостоятельно, но некоторые довольно хорошо сделаны. Чтобы начать с нуля и подняться довольно высоко, подумайте также о взгляде на Академию Хана .
Некоторые идут немного дальше и предлагают реальные онлайн-курсы бесплатно, где у вас также есть доступ к материалам курса, но где они также предоставляют лекции и регулярные самооценки. Например, посетите Coursera или Udacity .
Большинство из вышеперечисленных часто публикуют свои лекции на Youtube или iTunesU, поэтому вы найдете много материала, если ваша жажда знаний еще не была утолена всеми предыдущими ссылками.
Если вы хотите что-то более близкое к «настоящему» университету, вы можете подумать об отдаленных университетах, которые также позволяют вам работать неполный рабочий день, но требуют, чтобы вы следовали темпам и имели как самооценку, так и окончание учебы. год экзаменов (иногда на месте), как с OpenUniversity и его международных вариантов.
Страсть заставляет вас идти
(и получите достаточно глазного яблока, смотрящего на ваш код, чтобы критиковать вас и рассматривать различные перспективы)
Французы говорят:
Продолжайте делать то, что делаете, и в конце концов вы станете экспертом. Занимает время и работу.
Смотрите также У меня проблемы обучения для получения дополнительных предложений.
PS: Хотя это очень спорный инструмент для интервью и не помогает определить хороших кандидатов, я часто использую FizzBuzz, чтобы, по крайней мере, отсеять невероятно «плохих». Так что давай провернем эту практикующую вещь! :)
источник
Я не очень долго программировал (начал учить себя SQL около 27 месяцев назад и начал программировать на Perl около 20 месяцев назад), но приведенная выше цитата звучит как то, что я слышал от бывших студентов:
Хорошо, последний был, вероятно, немного грубоват ... но я пытаюсь подчеркнуть, что решение проблем - это не запоминание . Если бы это было так, то какой-нибудь гений мог бы запрограммировать компьютер для решения любой проблемы, и никому из нас не пришлось бы снова думать (что это за адский мир ...).
Теперь это правда, что любое интеллектуальное усилие состоит, по крайней мере, из небольшого запоминания. В частности, если вы собираетесь писать код на PHP, вы должны понимать основные типы данных (числа, строки, массивы), основные вещи, которые вы можете делать с ними (для чисел: сложение, вычитание, умножение, деление и модуль: для строк: конкатенация, подстроки, замена и, по крайней мере, некоторые знания регулярных выражений, для массивов: конкатенация, привязка к элементам, объединение элементов, циклы, подсчет элементов и т. д.) и основные логические структуры, которые можно использовать (операторы if / then / else, циклы foreach, циклы while и т. д.).
Затем, когда вы столкнетесь с проблемой, используйте проблему, чтобы предоставить контекст для того, какие инструменты вам нужны. Для FizzBuzz вы должны указать, когда число делится на 3, 5 или 15. Итак, мы имеем дело с числами ... Какие основные инструменты позволяют нам определить, когда одно целое число делится на другое? Ну, оператор модуля. Итак, используйте это. (Конечно, если у вас есть номер
$n
, вам может показаться, что последняя цифра$n
0 или 5 и / или цифры$n
складываются в нечто, кратное 3, но я отвлекся ...) Вам нужно делайте это для каждого числа от 1 до 100, поэтому, чтобы избежать туннеля, используйтеforeach
петлю.Мораль этой истории такова: если вы, с одной стороны, говорите: «Я в принципе способен написать любую законченную систему на PHP», а с другой стороны, вы не можете кодировать FizzBuzz, то первое утверждение неверно. Некоторые из моих бывших учеников по исчислению клялись, что они понимают концепции, но они просто не могут выполнить задачи на экзамене ... или домашние задания ... или проблемы с викторинами. Они также ошибались в своем понимании.
Прекратите оправдываться и изучите основы.
источник
Вы можете подумать, что FizzBuzz - проблема с игрушками; когда мне когда-нибудь понадобится использовать оператор модуля в реальной программе. Но на самом деле вы используете это все время. Три распространенных примера:
row_number % 2 == 0
), и отображаете один цвет для четных строк и один для нечетных.if item_number % N == 0
было записано как эквивалент (if item_number|divisbleby: N
).if cur_item_number % 50 == 0 then commit_data
.Конечно, есть и другие способы сделать все это. Но вы можете делать шипение, не используя оператор модуля или сравнивая деление с плавающей точкой с целочисленным делением. Например, для FizzBuzz вы можете сделать что-то вроде следующего псевдокода.
В заключение, если вы хотите когда-нибудь стать великим программистом, не спешите изучать книги по языку. Да, в книге по PHP / Java вы получите ответы от google / stackoverflow и наполовину работающих программ гораздо быстрее, чем что-либо еще. Но для того, чтобы на самом деле знать, как писать программы с оптимальным качеством и думать, как программист, вам нужно познакомиться с настоящими книгами по CS.
Начните с книги по CS, которая знакомит с языком программирования и основами CS, со знаменитым примером Структуры и Интерпретации компьютерных программ (который научит Scheme - диалект Lisp) или, возможно, с чем-то еще, например, Think Python Как думать, как компьютер Ученый (которого я не читал). Оба из них бесплатны онлайн.
В конечном итоге вам нужно прочитать хорошую книгу по алгоритмам, лучшим из которых является Алгоритмы CLRS (не бесплатно), хотя эта бесплатная онлайн- книга по алгоритмамможет быть недорогой заменой (хотя, если вы можете просто купить CLRS). Книга по алгоритмам научит вас, как решать проблемы с компьютером, и познакомит вас с различными структурами данных (массивы / связанные списки / кучи / двоичные деревья / B-деревья / HashTables) и важными алгоритмами, которые вам необходимо знать, как оптимально использовать , Вам не нужно запоминать каждое доказательство или знать, как идеально написать каждый алгоритм (кто когда-либо использовал кучу Фибоначчи); но вы должны интуитивно знать, что два вложенных цикла for это O (N ^ 2); сортировки сравнения в лучшем случае O (N lg N), бинарный поиск - O (lg N), можно найти медиану в O (N), почему базы данных на жестких дисках используют B-деревья и т. д.). Как минимум, глубокие знания книги по алгоритмам помогут вам в технических интервью по программированию для Google / Facebook. При чтении книг по программированию не просто читайте / читайте; вы'
Я также рекомендовал бы книгу по разработке программного обеспечения (либо Code Complete, либо Pragmatic Programmer) после того, как вы пройдете книгу по CS и алгоритмам, которая научит лучшим методам написания хорошего кода, который можно поддерживать (чистые имена; комментируйте только при необходимости). сохраняйте код вместе, выполняйте рефакторинг при необходимости, используйте контроль версий и т. д.).
источник
Никто не запоминает эту вещь. Вы должны придумать это самостоятельно. Если вы знаете оператор модуля и знаете, что он делает, то он тривиально подходит к проблеме FizzBuzz.
Я собираюсь выйти на конечности здесь и в целом предположить, что проблема в PHP. Мне нравится говорить, что Java - худший из когда-либо созданных языков, а PHP - худший из когда- либо созданных языков , потому что даже его создатели признают, что он никогда не разрабатывался. Трудно выучить хорошие практики разработки программного обеспечения, когда ваша среда - это практически определение того, как этого не делать. И в зависимости от структуры, чтобы сделать все это не говорит много.
Ява - один из самых простых и худших из существующих языков. У него есть только одно: ручное наследование, собираемое мусором. Если ваши друзья или советники говорят, что Java сложна, найдите новых друзей. C ++ является сложным языком , который включает в себя много понятий, и что никто не будет оспаривать. Вы также можете сделать C #, который, по крайней мере, имеет несколько обобщений и лямбд.
Как вы собираетесь учиться кодировать, когда ваши языки были разработаны и реализованы людьми, которые не могут кодировать, и вы зависите от каркасов для всего, что вы делаете?
источник
Я думаю, вы должны внимательно посмотреть, почему вы оказались в затруднительном положении, пытаясь выяснить FizzBuzz. Итак, предположим, вы вспомнили, что есть оператор, который
$n
сообщает вам, делится ли он на число. И вам не повезло забыть, что это такое. Хорошо, почему бы вам не попытаться сделать это каким-либо другим способом? Если вы знаете что-нибудь о коде, вы сможете найти дюжину других способов сделать это. Некоторые из них могут выглядеть странно - как, например, помещать каждое кратное 5 в массив, а затем проверять, есть ли$n
среди них - и это плохое решение, но оно все равно будет решением. Тем не менее, вы говорите, что у вас их не было, вы просто застряли. Это может быть симптомом более серьезной проблемы.В программировании нужно учиться двум вещам.
С вашей точки зрения описание выглядит так, как будто вы начали с первой части, но несколько не хватает во второй части. Хороший курс CS обычно очень помогает в этом, но это не единственный способ. Попытка решить различные проблемы и прочитать о том, как эти проблемы должны быть решены, читая фундаментальные книги, цитируемые здесь - все, что могло бы помочь. Как только у вас появится мышление программиста, вы обнаружите, что использование нового пакета хитростей не станет большой проблемой. Конечно, вам придется гуглить здесь и там, но вы никогда не окажетесь в затруднительном положении.
источник
Вы добиваетесь успеха в развитии так же, как вы делаете что-то еще - практикуйтесь. В мире программирования есть хорошая концепция, называемая кодом ката . По сути, это упражнение, в котором вы кодируете решение относительно небольшой проблемы, анализируете, что хорошо, а что плохо, отбрасываете все это и делаете это снова. FizBuzz - это отдельное ката. Так что делай и делай больше. Когда вы находите вещи, которые кажутся вам не очень хорошими или просто не работают, проводите исследования и будьте внимательны. Задайте вопросы на сайтах вопросов и ответов, прочитайте статьи и блоги, посмотрите, как другие справляются с этим, а затем попрактикуйтесь в том, что вы узнали.
В ходе этой практики вы узнаете, сколько дополнительных математических / теоретических знаний вам может понадобиться. Если вы натолкнетесь на концепции, которые просто не можете обернуть вокруг себя, то прочитайте о них и об их обязательных знаниях и в каждом конкретном случае решайте, хотите ли вы пройти курс или что у вас есть, чтобы расширить свой кругозор. теоретические основы.
источник
Я понимаю, что это означает, что вы не знали и / или не помнили оператор модуля. Если это так, то для начала нужно изучить языковые конструкции на языке, который вы используете. Просмотрите все, что вы не знаете «холодно», и узнайте все, что вы просто не знаете.
источник
Продолжайте кодировать, продолжайте учиться. В конце концов, с достаточной самоотдачей вы посмотрите на FizzBuzz и удивитесь, почему вам даже пришлось подумать об этом. Многие компании задают вопрос в стиле FizzBuzz в качестве очень ранней части своих интервью, поэтому провал этого раза означает, что вы хотя бы кое-что узнали о процессе найма.
Просто продолжайте писать код, придумывать идеи проекта и исследовать.
источник
Могу ли я рекомендовать изучение JavaScript до Java, C ++? Причины для вас:
Бесплатные ресурсы для новичков
http://www.codecademy.com/tracks/code-year
https://stackoverflow.com/tags/javascript/info У
меня было еще около 10 ссылок, но SE не позволит мне публиковать их, пока я не достигну 10 повторений.
Изучение C ++, Java и т. Д. Также полезно, но не IMHO не оказывает общего влияния на веб-программирование, как JS, так как вы можете использовать его как на переднем, так и на заднем плане. Веселиться!
источник
Вы можете найти и помочь другим, например, предоставив .code (раскрытие: мой сайт) или Code for America или что-то еще. Это отличный способ получить больше информации о проблемах, связанных с созданием веб-страниц, не связанных с PHP, и чувствовать себя хорошо.
Если у вас есть проблема, которую нужно решить - или помочь решить, или просто понять - выбор кода происходит естественным образом. Иметь цель - лучший способ чему-то научиться.
источник
Таким образом, вы не можете решить проблему FizzBuzz. Большое дело Теперь вы можете, и я уверен, что вы никогда не забудете все бесчисленные способы, как. Постарайтесь не так стремиться заявить о себе как о плохом программисте просто потому, что вы не можете решить одну глупую проблему с ног на голову.
Это одна проблема. Другое - то, что вы, кажется, чувствуете себя немного позади кривой обучения программированию. Как уже говорили другие, продолжайте кодировать и продолжайте читать. Чем больше вы делаете, тем лучше вы получите. Это так просто. Начните с того, что вы считаете самой большой дырой в вашем фоне, и продолжайте оттуда.
источник
Я не думаю, что я бы отказался рекомендовать кого-то на работу, потому что они не знали, что это был оператор модуля при условии, что:
Это не всегда (хотя обычно)%, а некоторые языки странные. И, черт возьми, после десятилетия я не могу честно сказать, что я знаю все операторы Perl (и что делает космический корабль еще раз?), И при этом я не могу всегда точно вспомнить побитовые операторы. Прошло несколько лет с тех пор, как я делал все, что даже требовало этого.
Что могло бы заставить меня не решиться рекомендовать кого-то, так это то, что это вызвало у него приступ паники из-за пропуска этого вопроса / теста. Это может создать у меня впечатление, что они были слишком зелеными (если только это не была позиция начального уровня). Никому не нужен кто-то, кто (или чувствует необходимость) запомнить эти вещи. Вам нужен кто-то, кто понимает гораздо более широкие концепции. Никто не будет заботиться, если вы посмотрите это на Google, но вы должны быть уверены в интервью, что зная% не было ничего особенного, а также что вы знаете, как использовать «оператор» в качестве ключевого слова, когда вы делаете быстрый Google поиск.
Кроме того, это всего лишь идея ... но если в вашем местном колледже есть программа compsci, все ваши кредиты будут переведены, и вам, вероятно, понадобится всего около 20 кредитов для 2-летней степени. Может почти закончить это в семестре. Они предложат вам пройти курс структур данных, а также, надеюсь, алгоритмы ... могут сделать вас немного сильнее.
источник
Вот пример курса: http://www.ox.ac.uk/admissions/undergraduate_courses/courses/computer_science/computer_science_.html
Вначале я предлагаю прочитать следующее: объектно-ориентированное программирование (очень распространенное, везде используется, именно здесь появляется java) параллелизм (для написания java-программ, которые не происходят таинственным образом в реальном мире, узнают о взаимоблокировках) концепции базы данных (большинству приложений необходимо сохранять данные, теория здесь важна). Парадигмы программирования (прочитайте, по крайней мере, об одном языке, не относящемся к ой, желательно функциональном, чтобы расширить свое мышление и изучить новые вещи)
Когда я смотрю на 4 года обучения в области компьютерной науки, если честно, я думаю, что есть только несколько курсов, к которым нужно относиться серьезно.
Структуры данных и алгоритмы (и вам нужна математика здесь, чтобы стать действительно хорошими и восприниматься другими программистами серьезно), компьютерные сети и операционные системы приходят на ум как наиболее важные. Другие предметы, которые имеют дело с кодом более низкого уровня, например, возможность писать код на ассемблере, возможно, не так важны для вас. Разработка программного обеспечения и тестирование открывают для вас полезные концепции, и вы можете со временем это понять.
Просто скачайте PDF-файл, который интуитивно объясняет эти понятия, и вы уже в пути.
На некоторых курсах по компьютерным наукам, по крайней мере на моем, первый год - это введение во все области машиностроения, такие как механика, электротехника, гражданское дело и т. Д. Заметьте, что существует множество сложных математических программ, которые опять-таки могут быть или не иметь отношения к делу. для большинства программистов приложений сегодня. Итак, многие из сегодняшних инженеров на самом деле имеют всего 3 года реального компьютерного образования (надеюсь, это заставит вас чувствовать себя лучше :)
Суть ответа: вы можете потратить некоторое время на изучение каждый день, скажем, час или около того, и через некоторое время стать довольно хорошим программистом. Просто продолжай учиться. И не забывайте писать код каждый день.
источник
Для меня моя стратегия состоит в том, что я атакую только проблему, которая имеет отношение к тому, что я работаю, поэтому я советую, что вам не нужно изучать все это, просто прочитайте те вещи, которые имеют отношение к тому, что вы работаете, потому что, если вы попытались изучить все это сразу, то есть тенденция к тому, что вы падаете ниц и в конечном итоге ненавидите программирование.
мир
источник