Як бути чудовим програмістом

Що відрізняє справді чудових програмістів?

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

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

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

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

Вирішувач проблем надзвичайний

По-перше, ви повинні бути ефективним вирішувачем проблем. Тут важливо почати, оскільки програмування - це вирішення проблем.

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

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

Речі почали змінюватися, коли я почав дізнаватися про процес вирішення проблем та про те, як ефективно їх вирішити. Зараз я починаю проблему з наміром. У мене є книга Джорджа Полі " Як це вирішити" , щоб подякувати за цю пораду.

Я адаптував деякі ідеї Полі до програмування, наприклад, розуміння проблеми. "Проблема повинна бути зрозумілою", - пише Поля. Сюди входить можливість «вказати на основні частини проблеми, невідомість, дані та стан». Для кожної проблеми я витягую аркуш паперу і пишу відповіді на ці запитання: що я вирішую чи намагаюся знайти? (невідомо); що мені дають? (дані); і яких обмежень чи деталей мені потрібно знати? (хвороба).

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

Звідти я складаю план, що є ще однією з пропозицій Полі. Це має сенс. Я пишу план перед тим, як написати статтю. Художник робить ескіз картини перед початком роботи над самою картиною. Будівельник використовує креслення та креслення для будівництва будинку. Нічим не відрізняється від програмування. Замість того, щоб поспішати робити , мені для початку потрібно подумати про те, що я збираюся зробити, і скласти план нападу.

Є багато способів зробити це. Іноді я окреслюю кроки, які мені потрібно зробити, у цифровому порядку: спочатку зроби це, друге - те. Інший раз я роблю проблему наочною. Коли я вчився про петлі, я витягнув жменю мигдалю і фізично перебрав купу. Це безглуздий приклад, але це допомогло мені продумати проблему.

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

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

Коли я читаю код, написаний чудовим вирішувачем проблем, він чистий і зрозумілий. Змінні добре названі. Функції короткі та чіткі. Кожен рядок коду має певне призначення; пух видаляється. Чіткість коду відображає процес роздумів програміста: я можу читати програму зверху вниз і точно знати, що відбувається. Це велике вирішення проблем, і я до цього прагну.

А як щодо вашого комп’ютера?

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

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

Це також збагачує моє розуміння того, як працюють основні концепції програмування. Наприклад, я працював над рекурсивною проблемою, і я не отримав очікуваного рішення. Після ретельного вивчення я зрозумів, чому: це було пов’язано із виконанням стека дзвінків - ідеї, яка уникла б мене всього кілька місяців тому.

Або брати уроки. Я довго боровся з заняттями, і мені було страшно користуватися ними. Я знав, як писати клас, але не був впевнений, коли і навіщо його використовувати. Це змінилося, коли я дізнався, що насправді відбувається у моєму комп’ютері, коли я створюю екземпляри та викликаю методи. Це нарешті клацнуло, як тільки у мене виник якийсь контекст. Як для рекурсії, так і для занять комп’ютерні науки заповнили прогалини в моїх знаннях.

Занадто часто основи відкидаються. Прогрес може бути повільним, і люди, як правило, вибирають більше “веселих” речей, над якими працюватимуть, коли їм надається така можливість. Це ганьба. Програмісти, які опановують основи, здається, впевнено кодують: вони знають, "як" і "чому" у своєму виборі програмування, що покращує їх роботу та підвищує їхню довіру до інших.

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

Я письменник (amymhaddad.com) і програміст-початківець.