Ф'ючерси
Сотні безстрокових контрактів
TradFi
Золото
Одна платформа для світових активів
Опціони
Hot
Торгівля ванільними опціонами європейського зразка
Єдиний рахунок
Максимізуйте ефективність вашого капіталу
Демо торгівля
Вступ до ф'ючерсної торгівлі
Підготуйтеся до ф’ючерсної торгівлі
Ф'ючерсні події
Заробляйте, беручи участь в подіях
Демо торгівля
Використовуйте віртуальні кошти для безризикової торгівлі
Запуск
CandyDrop
Збирайте цукерки, щоб заробити аірдропи
Launchpool
Швидкий стейкінг, заробляйте нові токени
HODLer Airdrop
Утримуйте GT і отримуйте масові аірдропи безкоштовно
Launchpad
Будьте першими в наступному великому проекту токенів
Alpha Поінти
Ончейн-торгівля та аірдропи
Ф'ючерсні бали
Заробляйте фʼючерсні бали та отримуйте аірдроп-винагороди
Інвестиції
Simple Earn
Заробляйте відсотки за допомогою неактивних токенів
Автоінвестування
Автоматичне інвестування на регулярній основі
Подвійні інвестиції
Прибуток від волатильності ринку
Soft Staking
Earn rewards with flexible staking
Криптопозика
0 Fees
Заставте одну криптовалюту, щоб позичити іншу
Центр кредитування
Єдиний центр кредитування
Центр багатства VIP
Преміальні плани зростання капіталу
Управління приватним капіталом
Розподіл преміальних активів
Квантовий фонд
Квантові стратегії найвищого рівня
Стейкінг
Стейкайте криптовалюту, щоб заробляти на продуктах PoS
Розумне кредитне плече
New
Кредитне плече без ліквідації
Випуск GUSD
Мінтинг GUSD для прибутку RWA
Посібник для початківців у програмуванні - платформа для криптовалютних бірж
Програмування для початківців
Передмова
Сьогодні програмування стає все більш необхідною «здібністю»: як дизайнер, знання деяких основ програмування допоможе краще зрозуміти свою роботу; як підприємцю, роль технічного засновника зробить багато ваших завдань значно легшими. А для новачка, що тільки починає, перед обличчям безлічі інформації, можливо, зовсім незрозуміло, з чого почати; після легкого проходження початкових матеріалів, навчання стає все важчим, крута крива навчання відлякує; ви знаєте, як вивести текст на сторінці, але не знаєте, коли варто почати справжній корисний проект; ви не розумієте, що ще не знаєте, і навіть не уявляєте, що вчити далі.
Зміст цієї статті не лише дасть кілька орієнтовних порад, але й включить базовий огляд основ програмування. Звісно, шлях «крок за кроком» — нереальний, і кожна людина має свої особливості, тому цей путівник більше спрямований на стимулювання роздумів читача, щоб допомогти сформувати власний шлях навчання.
Але слід пам’ятати: ця стаття написана для тих, хто щиро хоче навчитися програмуванню — тих, хто з рішучістю прагне створити щось справжнє, і не зупиниться, поки не досягне мети; а не для тих, хто просто «чув, що програмування цікаве». На мою думку, такі люди ніколи не зможуть потрапити у світ програмування, і тим більше — створити щось гідне.
Хоча тон статті — так званий «сильний погляд, слабка прихильність» (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» (у деяких регіонах — слово, що означає «нічого»). Питання: як максимально отримати інформацію з кожного рівня? Або інакше — як вивчати складні сфери (наприклад, програмування), що містять багато знань?
У процесі навчання і розвитку існує ключова проблема: початківці часто орієнтуються на цілісність і ігнорують основи. Наприклад, багато мріють зробити робота, але не розуміють фізичних моделей, що стоять за цим, або не мають уявлення про основи електроніки, сенс і принципи роботи систем.
Якщо початковий рівень — це «запуск двигуна і компонентів» без розуміння їхньої побудови, це обмежить їхні можливості у майбутньому і ускладнить діагностику проблем. Другий великий підводний камінь — це надмірне зосередження на цілісності, що іноді здається ефективним, але з часом може призвести до труднощів при поверненні до основ. Тому важливо балансувати між цілісним і редукціоністським підходами.
Не слід також йти у крайність і занурюватися у глибини теорії без практики — це призведе до сухості і втрати мотивації. Це особливо характерно для студентів комп’ютерних наук.
Щоб краще зрозуміти, порівняймо навчання програмуванню з вивченням кулінарії: купити кілька книг з рецептами — гарна ідея, якщо ви готуєте для сім’ї. Ви можете слідувати рецептам і приготувати смачну страву. Але якщо ви прагнете стати великим шеф-кухарем, потрібно зрозуміти ідею за рецептами, їхню теорію, а не просто сліпо повторювати. Якщо ж ви щодня будете лише читати товсті теоретичні книги без практики — станете поганим кухарем або й зовсім не зможете готувати.
Отже, програмування — це міст між теорією і практикою, сфера перетину комп’ютерної науки і застосувань. Правильний шлях навчання — це поєднання досліджень і проектної роботи, щоб отримати інтуїцію і мотивацію, а також закріпити базові знання і зрозуміти ідеї.
Як початківець, слід орієнтуватися на перше, а друге — допомагає.
Основи програмування
«Яку мову програмування вчити?» — це часто перше питання новачків, але воно — неправильне. Перш за все, потрібно з’ясувати: «З яких компонент складається основа навчання програмуванню?»
На нижньому рівні «піраміди» знань з програмування — три ключові частини:
Для початкового рівня вибір 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 — «вступна книга», для новачків вона все ж складна. Ось кілька корисних додаткових ресурсів:
Після цього у вас сформується цілісна модель програмування, і ви зрозумієте, що запам’ятовування бібліотек і синтаксису — недостатньо. З’явиться ясність, що і як вчити далі. Наступний крок — практика проектів. Для початківців раніше участь у відкритих проектах — не найкраще рішення. Краще почати з простих проектів: створити сайт, зробити невелику гру і розширювати її. Якщо ідей немає — слідкуйте за «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.
Після завершення цієї книги у вас буде міцна основа для вивчення ОС, компіляторів, мереж. Вивчаючи більш просунуті системи, корисно паралельно застосовувати теорію на практиці — писати код, що ілюструє концепції.
Базові структури даних і алгоритми
Зараз багато хто вважає, що програмування — це просто використання чужого коду, і що важливіше — знання математики і алгоритмів. Це — хибне уявлення. Без міцної теорії ви швидко застрягнете.
Структури даних і алгоритми — це парні поняття. На початковому етапі потрібно знати, які алгоритми і структури даних швидше вирішують задачі. Це вимагає знання основних структур і алгоритмів, і краще — писати їх вручну, на папері. Важливо розуміти, для чого і коли їх використовувати.
Ресурси для навчання:
Інші важливі навички
Паралельно з основами важливо навчитися правильно ставити питання: вміти шукати відповіді через пошукові системи, ставити питання на Stack Overflow або Zhihu, і перед цим почитати статтю «Як ефективно ставити питання».
Не ізолюйте себе — спілкуйтеся з іншими, створюйте власний сайт, ведіть блог, підписуйтеся на популярні ресурси: Joel on Software, Peter Norvig, Coding Horror.
Вивчайте англійську — вона відкриває доступ до більшої кількості якісних ресурсів.
Підсумки
Не бійтеся — навчання програмуванню не швидкий проект за кілька тижнів. Ви зіткнетеся з труднощами, але застосовуйте техніку Феймена: дробіть складне на дрібне, пояснюйте іншим — і зрозумієте. Не все одразу — з часом все стане зрозумілим.
Крім згаданих матеріалів, є ще багато книг, які варто перечитувати і вивчати. Зокрема, у списках обов’язкових для програмістів книг — «Code Complete» і «The Pragmatic Programmer». Вони допоможуть закріпити знання і сформувати правильний підхід.
Якщо ви слідуєте цим рекомендаціям і наполегливо вчитеся — станете справжнім прагматичним програмістом і зможете легко долати будь-які виклики.
Після завершення — ви вже не боятиметеся нових мов, API, технологій. Ваша впевненість зросте, і ви будете почувати себе більш досвідченим. Це — початок великого шляху, і він відкриє перед вами багато можливостей.
()(