Посібник для початківців у програмуванні - платформа для криптовалютних бірж

Програмування для початківців

Передмова

Сьогодні програмування стає все більш необхідною «здібністю»: як дизайнер, знання деяких основ програмування допоможе краще зрозуміти свою роботу; як підприємцю, роль технічного засновника зробить багато ваших завдань значно легшими. А для новачка, що тільки починає, перед обличчям безлічі інформації, можливо, зовсім незрозуміло, з чого почати; після легкого проходження початкових матеріалів, навчання стає все важчим, крута крива навчання відлякує; ви знаєте, як вивести текст на сторінці, але не знаєте, коли варто почати справжній корисний проект; ви не розумієте, що ще не знаєте, і навіть не уявляєте, що вчити далі.

Зміст цієї статті не лише дасть кілька орієнтовних порад, але й включить базовий огляд основ програмування. Звісно, шлях «крок за кроком» — нереальний, і кожна людина має свої особливості, тому цей путівник більше спрямований на стимулювання роздумів читача, щоб допомогти сформувати власний шлях навчання.

Але слід пам’ятати: ця стаття написана для тих, хто щиро хоче навчитися програмуванню — тих, хто з рішучістю прагне створити щось справжнє, і не зупиниться, поки не досягне мети; а не для тих, хто просто «чув, що програмування цікаве». На мою думку, такі люди ніколи не зможуть потрапити у світ програмування, і тим більше — створити щось гідне.

Хоча тон статті — так званий «сильний погляд, слабка прихильність» (Strong Opinions, Weakly Held), читачі все одно повинні ставитися з скепсисом до всього, що тут написано, і перевіряти його точність. Якщо виникнуть питання — радо обговоримо.

Настроювання менталітету

Визначення цілей

Перед початком навчання подумайте про свої цілі: чітке уявлення про кінцеву мету зробить шлях яснішим. Що саме ви хочете створити? Веб-сайт? Гру? iOS або Android додаток? Або ж автоматизувати нудні задачі, щоб мати більше часу для прогулянок? Можливо, ви просто прагнете підвищити свою конкурентоспроможність і знайти хорошу роботу. Усі ці цілі цінні і мотивують вас у навчанні. Без мотивації важко пройти довгий і іноді нудний шлях.

Можливо, цей відео-матеріал надихне вас: «Що не навчають у більшості шкіл»

Не поспішайте

Погане програмування — легко. Навіть «чайники» можуть опанувати його за 21 день. Хороше програмування вимагає думки, але кожен може це зробити і відчути неймовірне задоволення від цього. Погане програмування — дуже просто. Навіть дурні можуть навчитися за 21 день. Хороше — потребує зусиль, але кожен може це зробити і відчути справжнє задоволення.

В магазинах і онлайн-кінотеатрах часто зустрічаються книги типу «Вивчіть за 21 день X», які обіцяють швидко навчити вас потрібним навичкам. Matthias Felleisen у своїй книзі «How to Design Programs» прямо критикує цю тенденцію і висміює її.

«Швидкі рішення» або «золота кулі» не існує. Мудреці говорили, що оволодіння будь-якою справою потребує 10 років або 10 000 годин — так званий «десятилітній меч». Тому не поспішайте, наполегливість — ключ.

Розвивайте інтерес

Більшість хороших програмістів програмують не заради грошей чи слави, а тому, що їм це цікаво.

— Linus Torvalds

Захоплюйтеся програмуванням, воно цікаве саме по собі. Інтерес — бездонне джерело мотивації. Підтримуйте цей стан, щоб вкладати його у свої 10 років / 10000 годин навчання. Програмування — це радість дослідження і створення. Побачити свої роботи на екрані — цікаво. Люди захоплюються вашим кодом — цікаво. Хтось хвалить ваш продукт у публічних місцях, сусіди користуються ним, обговорюють у медіа — цікаво. Програмування має бути дуже цікавим, і якщо ні — знайдіть причину і виправте її.

Починаємо навчання

Натхненні історії

Ще в початковій школі я почав вивчати програмування. На жаль, я прочитав кілька популярних тоді книг типу «Освоїте C++ за 21 день», і хоча це не зашкодило, я міг писати невеликі програми. Але коли виникали збої у програмному забезпеченні, я не розумів, чому, і не міг вирішити складні проблеми, що виходили за межі бібліотек. Хоча я щодня писав код, мої навички зростали дуже повільно, я мав дуже обмежене розуміння «ітерацій» і «рекурсії», і використовував комп’ютер здебільшого як калькулятор.

Після вступу до університету я вивчав фізику. Спершу я заучував формули, не розуміючи, як вони виведені, які між ними зв’язки і що вони означають. Я вчився вирішувати типові фізичні задачі, але не розумів «чому» за ними стоїть.

Коли я намагався створити комп’ютерну гру на основі фізичних моделей, я знову натикнувся на труднощі: не міг швидко вирішити нові задачі, страх перед новими проблемами зростав, і я почав уникати їх, намагаючись просто копіювати і вставляти код через Google. На щастя, один урок у старшій школі кардинально змінив мій підхід до навчання. Це був перший раз, коли я відчув «відкриття очей»: я усвідомив, що маю дуже поверхневе розуміння деяких предметів, зокрема фізики і комп’ютерних наук.

Про цей урок: ми щойно вивчили електрику і спеціальну теорію відносності, і викладач намалював на дошці дві теми і з’єднав їх лінією. «Припустимо, у нас є електрон, що рухається вздовж провідника зі швидкістю, близькою до швидкості світла…» — спочатку він просто записував знайомі формули, але після кількох алгебраїчних доведень з’явилася магічна формула магнітного поля. Хоча я давно знав цю формулу, тоді я зрозумів, що між цими явищами існує глибший зв’язок. Різниця між магнітним і електричним полем — лише «залежно від точки зору». Я раптово усвідомив: тепер я починаю запитувати «чому», а не лише «як». Я повернувся до найосновніших понять і почав вчитися тому, що раніше ігнорував. Цей процес — болісний, але дуже важливий. Сподіваюся, ви зробите висновки і ніколи не повторюватимете моїх помилок.

Роздуми після пробудження

Цю ілюстрацію взято з книги Дугласа Хофстедтера «Гедель, Ешер, Бах». Кожна літера у ній складається з менших літер. На найвищому рівні ми бачимо «MU», де M складається з трьох концепцій HOLISM (цілісність), а U — з REDUCTIONISM (редукціонізм). Кожна з цих літер містить у собі іншу, і навпаки. На найнижчому рівні найменша літера — знову «MU», що складається з повторюваних елементів.

Кожен рівень абстракції містить інформацію. Якщо дивитися лише з позиції цілісності або редукціонізму, ви отримаєте лише «MU» (у деяких регіонах — слово, що означає «нічого»). Питання: як максимально отримати інформацію з кожного рівня? Або інакше — як вивчати складні сфери (наприклад, програмування), що містять багато знань?

У процесі навчання і розвитку існує ключова проблема: початківці часто орієнтуються на цілісність і ігнорують основи. Наприклад, багато мріють зробити робота, але не розуміють фізичних моделей, що стоять за цим, або не мають уявлення про основи електроніки, сенс і принципи роботи систем.

Якщо початковий рівень — це «запуск двигуна і компонентів» без розуміння їхньої побудови, це обмежить їхні можливості у майбутньому і ускладнить діагностику проблем. Другий великий підводний камінь — це надмірне зосередження на цілісності, що іноді здається ефективним, але з часом може призвести до труднощів при поверненні до основ. Тому важливо балансувати між цілісним і редукціоністським підходами.

Не слід також йти у крайність і занурюватися у глибини теорії без практики — це призведе до сухості і втрати мотивації. Це особливо характерно для студентів комп’ютерних наук.

Щоб краще зрозуміти, порівняймо навчання програмуванню з вивченням кулінарії: купити кілька книг з рецептами — гарна ідея, якщо ви готуєте для сім’ї. Ви можете слідувати рецептам і приготувати смачну страву. Але якщо ви прагнете стати великим шеф-кухарем, потрібно зрозуміти ідею за рецептами, їхню теорію, а не просто сліпо повторювати. Якщо ж ви щодня будете лише читати товсті теоретичні книги без практики — станете поганим кухарем або й зовсім не зможете готувати.

Отже, програмування — це міст між теорією і практикою, сфера перетину комп’ютерної науки і застосувань. Правильний шлях навчання — це поєднання досліджень і проектної роботи, щоб отримати інтуїцію і мотивацію, а також закріпити базові знання і зрозуміти ідеї.

Як початківець, слід орієнтуватися на перше, а друге — допомагає.

Основи програмування

«Яку мову програмування вчити?» — це часто перше питання новачків, але воно — неправильне. Перш за все, потрібно з’ясувати: «З яких компонент складається основа навчання програмуванню?»

На нижньому рівні «піраміди» знань з програмування — три ключові частини:

  1. Алгоритмічне мислення: наприклад, як знайти найбільше число у наборі? Спершу потрібно мати змінну max, потім для кожного числа…
  2. Синтаксис: як за допомогою певної мови програмування записати ці алгоритми, щоб комп’ютер їх зрозумів.
  3. Основи систем: чому при виконанні while(1) потік ніколи не закінчується? Чому функція типу int *foo() { int x = 0; return &x; } — недопустима?

Для початкового рівня вибір C як першої мови — дуже важкий і нудний, оскільки потрібно одночасно вчити ці три частини. Перед тим, як створити щось, потрібно багато часу.

Тому, щоб мінімізувати час на вивчення синтаксису і системних основ, рекомендується почати з Python — мови, що дуже дружня до новачків. Хоча Python і не є «іграшкою», у великих проектах його потужність і гнучкість очевидні. Після освоєння Python — хороший варіант перейти до C, щоб навчитися мислити близько до заліза і краще розуміти ОС.

Нижче наведено орієнтовний путівник для початкового етапу, щоб сформувати цілісну картину і почати дослідження з верхнього рівня вниз. Матеріали не мають строгої послідовності — обирайте будь-який, і якщо застрягнете — спробуйте інший.

MIT 6.00.1x — «Вступ до комп’ютерних наук і Python». Хоча курс викладається на Python, він — чудовий вступ, що наголошує на ключових концепціях і парадигмах у CS, а не лише на мові. Для непрофесіоналів це відкриє новий світ. Зміст: обчислювальні концепції, Python, базові структури даних і алгоритми, тестування і налагодження.

Harvard CS50x — «Вступ до комп’ютерних наук» від Гарварду. Також вступний курс, але доповнює MIT. Мова викладання — C, PHP, JavaScript + SQL, HTML + CSS. Ширина і глибина — на високому рівні, можна ознайомитися з новими технологіями і зацікавитися. Додатковий ресурс: читати «Код»

Після завершення початкового етапу у вас з’явиться базове уявлення про програмування. Тепер можна спробувати вивчити конкретну технологію — веб-розробку, Android, iOS — і створити простий проект для мотивації. Не занурюйтесь занадто глибоко у фреймворки і мови — зараз важливо закласти фундамент. Не намагайтеся одразу вивчити все, що хочете, — це призведе до провалу.

Що робити на початковому етапі? Переосмислити свої програми, подумати, чому вони так зроблені, і як писати краще. Вчитися розуміти суть: використовувати комп’ютер для розв’язання задач.

Уявлення:

X = час на розв’язання задачі, «вирішення проблеми»

Y = час на реалізацію коду, «використання комп’ютера»

Програмні здібності = F(X, Y) (X>Y)

Щоб підвищити навички, потрібно оптимізувати X і Y, а також функцію F(X, Y). Мало книг охоплюють ці три аспекти одночасно, але одна — «Structure and Interpretation of Computer Programs» (SICP) — саме це робить. Вона показує, як абстрагувати і розбивати задачі, що дозволяє вирішувати складні проблеми і змінює спосіб мислення. Мова — Scheme, що дає початкове уявлення про функціональне програмування. Графік дуже простий, тому швидко освоїти його і зосередитися на ідеях і рішеннях.

Пітер Норвіг писав чудовий огляд SICP, де сказано: «Якщо порівнювати з автомобілями, то SICP — для тих, хто хоче зрозуміти, як працюють машини, як їх будують і як проектувати економічні, безпечні, надійні авто для 21 століття. Ті, хто не люблять SICP, просто хочуть навчитися їздити — і все.»

Якщо ви — один із перших, читання SICP стане ключовим етапом між початком і подальшим навчанням.

Хоча SICP — «вступна книга», для новачків вона все ж складна. Ось кілька корисних додаткових ресурсів:

  1. Udacity CS212 — «Проектування комп’ютерних програм», викладає Пітер Норвіг, мова — Python, рівень складності — високий.
  2. «How to Design Programs, Second Edition» — нижчий рівень за SICP, підходить для початківців, якщо SICP здається занадто важким.
  3. Відео лекцій UC Berkeley з SICP і записи тренінгів авторів для Hewlett-Packard.
  4. «Composing Programs» — продовження ідей SICP, але з Python.
  5. Збірник задач з SICP — для самостійної практики.

Після цього у вас сформується цілісна модель програмування, і ви зрозумієте, що запам’ятовування бібліотек і синтаксису — недостатньо. З’явиться ясність, що і як вчити далі. Наступний крок — практика проектів. Для початківців раніше участь у відкритих проектах — не найкраще рішення. Краще почати з простих проектів: створити сайт, зробити невелику гру і розширювати її. Якщо ідей немає — слідкуйте за «Research Institute» або обирайте проекти з «Mega Project List».

Якщо SICP здається занадто складним — не варто себе примушувати. Можна перейти до книги «The Elements of Computing Systems», яка навчає з нуля — від NAND до повноцінного комп’ютера. Вона стане основою вашого початкового етапу і включає створення простого компілятора і ОС.

Щоб повністю освоїти цю книгу і закріпити знання, потрібно зробити кілька кроків (без строгого порядку):

Основи комп’ютерних систем

Після базового розуміння програмування корисно ознайомитися з книгою «Computer Systems: A Programmer’s Perspective, 3/E» («Глибоке розуміння комп’ютерних систем»). Назва перекладу — не зовсім точна, оскільки це — підручник «Вступ до системних аспектів» від CMU. Курс зосереджений на тому, як працює програма у системі, і охоплює багато деталей внутрішньої реалізації.

Якщо книга здається нудною, можна пройти курс на Coursera: «The Hardware/Software Interface» — частина CSAPP, з практичними лабораторіями. Також рекомендується ознайомитися з книгою «The C Programming Language» для повторення основ C.

Після завершення цієї книги у вас буде міцна основа для вивчення ОС, компіляторів, мереж. Вивчаючи більш просунуті системи, корисно паралельно застосовувати теорію на практиці — писати код, що ілюструє концепції.

Базові структури даних і алгоритми

Зараз багато хто вважає, що програмування — це просто використання чужого коду, і що важливіше — знання математики і алгоритмів. Це — хибне уявлення. Без міцної теорії ви швидко застрягнете.

Структури даних і алгоритми — це парні поняття. На початковому етапі потрібно знати, які алгоритми і структури даних швидше вирішують задачі. Це вимагає знання основних структур і алгоритмів, і краще — писати їх вручну, на папері. Важливо розуміти, для чого і коли їх використовувати.

Ресурси для навчання:

  1. «Introduction to Algorithms» — не слід сприймати буквально як підручник для початківців, але його можна пропустити, якщо важко. Спершу можна подивитися «Data Structures and Algorithm Analysis».
  2. «Algorithms: Design and Analysis» (частини 1 і 2) — курси Стенфорда, без прив’язки до мови. Якщо англійська слабка — можна взяти курс з MIT.
  3. Вивчення базових алгоритмів для малих задач — книги «Programming Pearls», «The Art of Computer Programming».

Інші важливі навички

Паралельно з основами важливо навчитися правильно ставити питання: вміти шукати відповіді через пошукові системи, ставити питання на Stack Overflow або Zhihu, і перед цим почитати статтю «Як ефективно ставити питання».

Не ізолюйте себе — спілкуйтеся з іншими, створюйте власний сайт, ведіть блог, підписуйтеся на популярні ресурси: Joel on Software, Peter Norvig, Coding Horror.

Вивчайте англійську — вона відкриває доступ до більшої кількості якісних ресурсів.

Підсумки

Не бійтеся — навчання програмуванню не швидкий проект за кілька тижнів. Ви зіткнетеся з труднощами, але застосовуйте техніку Феймена: дробіть складне на дрібне, пояснюйте іншим — і зрозумієте. Не все одразу — з часом все стане зрозумілим.

Крім згаданих матеріалів, є ще багато книг, які варто перечитувати і вивчати. Зокрема, у списках обов’язкових для програмістів книг — «Code Complete» і «The Pragmatic Programmer». Вони допоможуть закріпити знання і сформувати правильний підхід.

Якщо ви слідуєте цим рекомендаціям і наполегливо вчитеся — станете справжнім прагматичним програмістом і зможете легко долати будь-які виклики.

Після завершення — ви вже не боятиметеся нових мов, API, технологій. Ваша впевненість зросте, і ви будете почувати себе більш досвідченим. Це — початок великого шляху, і він відкриє перед вами багато можливостей.

()(

Переглянути оригінал
Ця сторінка може містити контент третіх осіб, який надається виключно в інформаційних цілях (не в якості запевнень/гарантій) і не повинен розглядатися як схвалення його поглядів компанією Gate, а також як фінансова або професійна консультація. Див. Застереження для отримання детальної інформації.
  • Нагородити
  • Прокоментувати
  • Репост
  • Поділіться
Прокоментувати
0/400
Немає коментарів
  • Закріпити