Мої відкриття на курсі CS50

💡 Усі статті, обговорення, новини для початківців — в одному місці. Приєднуйтесь до Junior спільноти!

Привіт, я Алла Капля, Junior Backend Developer. В цьому матеріалі я розповім, як мій досвід навчання на курсі CS50 став справжнім періодом відкриттів. Розпочинала цей курс вже маючи деяку базу, тому головною метою було поглибити вже здобуті знання. Тим паче, що я захоплююсь викладацькою майстерністю Девіда Малана.

Ще на початку мого навчання багато розробників з досвідом у п’ять-сім років говорили про те, що і самі час від часу повертаються до цього курсу. Та і про сам курс я дізналась зі статті розробника з досвідом. І спочатку я не розуміла, що може бути корисного для цих людей в основах комп’ютерних наук. Вони ж працюють з цим постійно!

Що ж, я і сама приємно здивувалась зробленим відкриттям ще на старті. Про що і розповім детальніше у цьому блозі. Можливо, цей матеріал ще й допоможе вам мотивувати себе не зійти з дистанції.

Не навчання — наповнення та розширення бази знань

Уроки побудовані так, що ви точно опануєте нові навички. Кожна відеолекція, яку проводить Девід, насправді нагадує розважальне шоу. Він залучає всі доступні інструменти, щоб пояснити, на перший погляд, складні речі так, щоб їх точно зрозуміли. Це емоційне викладання + залученість аудиторії. Такий формат дуже допомагає мені краще запам’ятовувати всі пояснення.

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

Зараз переглядаю оновлений CS50 від січня 2024 року паралельно з тим, щоб був доступний в грудні 2023-го, коли я його тільки починала. Тут можна простежити еволюцію у ефективності подання інформації. Крім того, додано розважальні елементи — роботи на базі ШІ допомагають Девіду викладати. Далі обіцяють ще більше інформації, пов’язаної із взаємодією зі штучним інтелектом.

Спільна логіка

Шкода, що я не натрапила на цей курс раніше, можливо обрала б інший стек. Не можу точно стверджувати стосовно стека, проте точно можу сказати, що CS50 точно вплинув би на вибір. Чому я так вважаю? Бо одне з ключових відкриттів:

Всі мови програмування мають спільну логіку — відрізняється тільки синтаксис.

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

Дебагінг

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

Досі не розумію, чому я про нього детально дізналась вже після завершення вивчення курсу Full-stack-розробки. Відверто здивована, що цей блок могли просто «опустити». Він справді важливий, і вміти дебажити код життєво необхідно. Це спростить вам життя в ролі девелопера — користуйтесь.

Using the Linux Command Line

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

Є думка, що засіла в голові завдяки деяким викладачам попереднього курсу: використання термінала для frontend-розробки не є необхідним. Можна, до прикладу, обійтись терміналом, який вбудований в VSCode. Рідкісні виключення говорили про необхідність опанувати bash. Сама я скористалась порадами з категорії рідкісних.

В CS50 є окреме чудове відео, що присвячене роботі з командами на прикладі операційної системи Linux. Проте багато команд спільні і для Mac, і для Windows. Крім того, в основному уроці (тема першого тижня) теж є цілий блок по роботі з терміналом. Там тільки основні команди, додаткові ви можете пошукати самостійно.

Цикли while та do while

Велика увага приділяється основам програмування на прикладі мови C. Зокрема, ви детально познайомитесь із:

  • типами даних;
  • логічними операторами;
  • операторами обчислення;
  • циклами або петлями;
  • масивами;
  • алгоритмами тощо.

Розумію, що для мене мали б бути знайомі цикли while та do while. Можливо для когось цей приємний сюрприз був би не цікавим. Але у мене саме з цих циклів було мало попередніх знань. Ми тільки читали в конспекті про їх існування та один раз переглянули синтаксис. Тобто не було розуміння, як ці петлі працюють і взагалі доцільність їх використання.

Дуже добре про ці цикли та про for подана інформація як у лекції Девіда Малана, так і у окремому короткому відео з поясненнями. Тому, якщо у початківців виникають труднощі з цією інформацією — вам точно допоможе пояснення в CS50.

Багато практики

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

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

Вихідний та машинний код

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

Висновки

Рішення піти на курс від Гарвардського університету за рекомендацією Ярослава було для мене правильним. Розуміючи краще основи, стаєте кращим спеціалістом. Оновлення та поглиблення знань дуже важливі для професійного зростання. Тому не вагайтесь, якщо ще думаєте, чи курс того вартий.

І моє питання до тих, хто вже навчався на CS50: що для вас стало відкриттям на цьому курсі?

👍ПодобаєтьсяСподобалось13
До обраногоВ обраному8
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Я також нещодавно пройшов цей курс. Що ж, нічого собі основи))) Для мене цей курс був досить складним. Я почав його проходити ще у 2019 році і цей курс виявився однією з причин чому я вирішив свічнутись в ІТ, попри те, що тоді курс виявився для мене занадто складним я загорівся справжнім інтересом до програмування. І от маючи за плечима вже майже 3 роки досвіду як розробник я вирішив пройти курс до кінця і цього разу мені таки вийшло)))
Важко буде виділити якесь одне відкриття на цьому курсі, адже свого часу цей курс став для мене відкриттям програмування))) Дякую, що ділитесь своїми враженнями, цікаво було порівняти

це абсолютно невірне твердження, показує що курс все ще гірший за універ або підручник

Це не абсолютно хибне твердження, й воно точно нічого не говорить про курс. Це одна з «фіч» top down підходу до навчання, коли за час навчання знання та розуміння предмету уточнюються й поглиблюються ітеративно, іноді приводячи до переоцінки певних тверджень майже на 180 градусів.

Коли новачок вперше бачить програмування, всі мови здаються дуже різними, а синтаксис здається чимось вирішальним. Згодом, після знайомства з кількома мейнстрімними мовами, починає здаватись що от, спіймав дзен, всі мови однакові якщо абстрагуватись від синтаксису. ТС знаходиться тут. Пізніше ТС дійде до переоцінки в зворотньому напрямку — ні, семантика та можливості/обмеження різних мов також дуже різні. Але якщо копати ще далі, в реалізацію (віртуальної машини, компілятора,...), то знов спільного виявиться дуже багато — бо під капотом навіть дуже різні мови можуть використовувати дуже подібні алгоритми виводу типів, управління пам’яттю і так далі (ну а ще нижче різниця зникає взагалі).

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

Мені здається, що я я застряг десь посередині. На початку кар’єри усі мови програмування здавалися мені однаковими. У 14-15 років проблема була більше у машинному часі, ніж у мові програмування. Була вільні машина в класі Yamaha MSX, ти програмуєш на BASIC, є час в іншому залі — Turbo C. Дивишся на Turbo Pascal — той же Turbo C.

І навіть зараз, якщо брати мейнстрім (але мені подобається більше термін ширпотреб), то усе +/- однакове. Нюанси різні, але це не тягне на різницю використання тієї чи іншої ліби де також будуть свої нюанси.

Якщо брати мови програмування не тільки мейнстрімні, то там часто виникають досить цікаві ідеї, які досить змінюють підходи та процесс розробки. Але вони не дуже доходять у мейнстрім. Чому сказати важко. Я бачу три можливі причини: (1) це дійсно неефективно; (2) більшість програмістів тупі, щоб це зрозуміти; (3) програмісти ліниві, щоб це вивчати.

Це здебільшого вірне твердження. Єдине зауваження може бути лише стосовно функціональних мов, у протилежність імперативних. А взагалі так, всі мови запозичують одна від одної ті самі концепти.

Ну... чому єдине? інше зауваження може у контрактно-орієнтованому програмуванні, яке виникло в Eifell. Ось, наприклад, невеличка вправа написати сортування з верифікацією в Ada:

VerifyThis Challenge in SPARK

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

Ну а так навіть Prolog вже ламає звичайні імперативні звички.

Всі мови програмування мають спільну логіку — відрізняється тільки синтаксис.

Прекрасно, ось код на Haskell, який підраховує кількість різних розшташувань N ферзів на шахівниці NxN щоб вони не били одне одного

import Control.Monad (foldM)
import Data.List ((\\))

queens :: Int -> [[Int]]
queens n = foldM f [] [1..n]
    where
      f qs _ = [q:qs | q <- [1..n] \\ qs, q `notDiag` qs]
      q `notDiag` qs = and [abs (q - qi) /= i | (qi,i) <- qs `zip` [1..]]

як він працює? А C# та Java так, одна ідея різний синтаксис.

Цикли while та do while

А от в деяких мовах програмування циклів немає, бо для них потрібні змінні.

Я думаю варто було б зробити корекцію до

Всі мови програмування _за які платять гроші_

Єдине, на що треба звернути увагу поза імперативним-ООП табором, — це реляційна алгебра та SQL. Якщо мета — це працювати за гроші на роботі.

Поза імперативно-ООП табором теж платять гроші :)

На Erlang доволі часто (~1% від, умовно, JS) є задачі. Буває Clojure. Решта, да, щезаюче мало.

А потім це компілюється в красивий байткод (або машинний код) з циклами.

Питання в тому, наскільки воно після цього ефективне. У Haskell зазвичай ефективність висока.

А машини з call/cc в залізі колись були. Всі подивились, поаплодували... і вернулись до традиційного.

The Missing Semester of Your CS Education
missing.csail.mit.edu

Рекомендую також цей курс — є текстова версія лекцій.

CS50 цей той курс, який варто рекомендувати знайомим початківцям, які починають свою кар’єру в ІТ, якісні навчальні матеріали позитивно впливають на ріст індустрії

Чому CS50 бо хайпово?

Є ще 49 курсів до нього, залежно від підготовки людини треба починати з
CS1: Introduction to Programming & Computation

я деколи в шокові з тих іт-шників, які пропонують починати з CS50 або Clean Code.
Сорі але це порада «як відбити бажання знайомим початківцям, і вказати їм на свою вищість за них»

CS50 починається з дуже простого рівня CS50×2023 — Lecture 0 — Scratch

Знайомим початківцям треба пояснювати, що програмування можна вивчити безкоштовно бо якісних матеріалів вистачає

Можна так само зверхньо радити «CS1: Introduction to Programming & Computation» та будь-які інші курси

А стосовно хайпу то це ж добре бо значить роботодавцям курс буде знайомим

Є ще 49 курсів до нього
я деколи в шокові з тих іт-шників, які пропонують починати з CS50 або Clean Code.

Де це Clean Code?

Це нумерація багатьох амеріканських університетів, у яких чомусь починається з 50, наприклад. Узріть — _Introduction_ to Computer Science.

З чого це ви так вирішили? Дійсно вважаєте, що назва з «50» означає наявність 49 до нього?

У них ще дуже часто найперший вводний курс зветься 101, це означає, що треба пройти інші 100 спочатку?;))

Вам треба якийсь ще курс пройти спочатку, пробачте:)) щоб не було таких ідей.

Перефразую. «Якщо не вчити CS, то світ ІТ для тебе сповнений магії». :)

А якщо вчити, станеш чарівником:)

Один раз відкривав CS50, зрозумів що все це ми вивчали в ДІІТі на першому курсі, нічого нового, подача гарна хіба що.

Подача мені дуже подобається

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

Особисто я зовсім не розділяю цю думку.

ну так це і є предмет для першого курсу і першого семстру в гарварді для КС
просто прикол в тому що у багатьох є предмети на вибір для розширення кругозору, і його, наприклад, може взяти умовний медик на 3му курсі

Можна, до прикладу, обійтись терміналом, який вбудований в VSCode.

Так там же термінал операційки

Проте багато команд спільні і для Mac, і для Windows

Linux та Mac так, а у вінди своє життя.

З Windows то взагалі окрема пісня, в результаті довелось мігрувати на Linux

І це при тому, що у вінді зараз є linux, який зручніший за багато які «реальні» дистрибутиви? :)

Він то звісно там є, але не скасовує купу оновлень, які до того ж криво лягають. Та і тут кожному своє, мені, до прикладу, зручнішим виявився в користуванні Linux.

Він то звісно там є, але не скасовує купу оновлень, які до того ж криво лягають.

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

І той «linux» в WSL має купу обмежень на те, що в ньому можна робити.

В реальності довелось все більш-менш серйозне робити в віртуалці. А WSL в основному для читання логів.

Я думаю, що це залежить конкретно від роботи. Я у WSL працюю з Docker + K8s (ну і всякі там мікро і не тільки сервіси) — все працює без проблем, ніяких специфічних обмежень через вінду не бачу.

От справді цікаво, які? Кросс-компіляція контейнер images — працює. Тестовий куб — minikube, k3d — без проблем.
Справді цікаво, що саме там не так?
Якщо що — я про wsl2

И я про WSL2. Какая базовая ось в нём у тебя стоит?

Є ubuntu 20.04, яку як три роки тому насетапив, так і використовую, і є 22.04 на win11.

Ну, может, в убунте и работает, нет причин сейчас пробовать. Я был вынужден ставить debian туда согласно задачам заказчика. Версия старая, апдейт до новой на свой страх и риск. Монтирование произвольных FS недоступно => докер, кубер и прочие ушли лесом, даже snapd недоступен.
Почему debian в таком загоне — не знаю. Но это не называется «работает без проблем».

Так на вінду встроєнна убунта з шелом і менеджером пакетів ставиться у два кліки. В чому проблема? Тут навіть простіше, ніж у макосі з цим.

А нах там прослойка у вигляді вінди тоді?

Ну не знаю навіть! Може тому що десктоп лінукс експірієнс навіть в 2024 все ще гемор порівняно з віндою чи макос?

«пограти в ігрушку» ≠ «десктоп лінукс експіріенс»

Я щось пропустив і хтось десь про ігри щось коментив? Чи ти робиш припущення хто в чому розбирається по тому, хто де працює? Попахує)

«хто де працює» — оцього точно не було. іншого — всього потрошку.
Просто як людина, котра десяток років користується лінуксом як звичайний пересічний нуб, саме у десктоп лінукс експіріенс не бачу нічого гемрного. ті самі проводнік-пкм-пуск (в kde/plasma), трей, панель. Нескучні шпалєри. Саме як десктоп експірієнс воно вже років десять точно працює нормально.
Основна і найчастіше обговорювана проблема, якимось чином дотична до десктоп експіріенсу — ігри, бо багато людей люблять погратися і саме в іграх проявляються недоліки чи особливості роботи відях і роботи самих ігор вцілому.

Віндовс в 2024 гальмо. Мак не знаю.
Що вам, до речі, крім браузера на десктопі треба? Це не риторичне питання, просто цікаво.

Ви досі не використовуєте Cygwin?

Ви досі використовуєте Cygwin, коли вже давно є wsl2?

WSL2 це самостійне середовище. Команди звідти не доступні з віндового PATH (окрім bash), тобто все треба запускати через bash. Це не зручно, та й VM як запустилась, буде жерти пам’ять постійно, а вам наприклад треба було лише MD5 порахувати.

а вам наприклад треба було лише MD5 порахувати.
Get-FileHash
   [-Path] <String[]>
   [[-Algorithm] <String>]
   [<CommonParameters>]

Дякую, я краще з Cygwin ))

Підписатись на коментарі