На співбесіді до інтернатури InterLink inCamp я прошу виконати нескладну алгоритмічну задачу. Незважаючи на її простоту, за статистикою, лише близько 10 відсотків кандидатів надають коректні рішення. Не обходить біда стороною і результати виконання тестових завдань вдома, після співбесіди.
Сьогодні ми з вами розглянемо основні проблеми, що переслідують студентів на цих етапах, та порадимо, як краще підходити до вирішення задач вцілому.
Неправильне розуміння поставленої задачі
Ми схильні сприймати навколишній світ відповідно до нашого досвіду. Тому схожі задачі ми сприймаємо як такі, які вже робили раніше. Так працює наша підсвідомість, і це добре. Адже підсвідомі рішення приходять швидше, ніж контрольовані. Та без подальшого аналізу результат не завжди відповідає очікуванням. Не розібравшись із завданням в достатній мірі, ви ризикуєте виконати непотрібну роботу, дарма витратити час, і в результаті не встигнути вирішити поставлену перед вами задачу.
Навіть якщо у вас немає запитань, повторіть завдання вголос і переконайтесь, що все зрозуміли вірно. Так ви не тільки досягнете поставленої мети, але й продемонструєте свою відповідальність. Не бійтесь перепитувати. Повторюйте, як ви зрозуміли співрозмовника. Згадайте офіціантів – досвідчений офіціант повторить для вас ваше замовлення перед тим, як піти. Ефективна комунікація не можлива без зворотного зв’язку.
Один цикл на всі випадки
І знову підсвідомість. Всі ми добре знаємо старий добрий for(int i = 0; i < 10; i++) цикл… І бачимо його всюди, де треба ітераційно вирішити задачу. Але знову ж таки, він не завжди підходить. Недоцільне використання одних і тих же рішень призводить до хибного вирішення завдань. Часом, зробивши невірний попередній крок, ми даремно витрачаємо зусилля, намагаючись знайти помилку в наступному.
Аналізуйте задачу та використовуйте найбільш прийнятні для її реалізації рішення.
for – добре підходить для виконання заздалегідь відомої кількості ітерацій;
forEach – найкращий варіант для проходження по одній колекції;
while { } або do { } while – цикли з перед- та після- умовою. Підходять для виконання заздалегідь невідомої кількості ітерацій.
while (true) або for(;true;) – нескінчені цикли. Для дійсно безкінечних операцій, або зі складними умовами виходу – в парі з break. Використовуйте обережно.
Не бійтесь піддавати сумнівам свої попередні кроки у виконанні завдання. Досліджуйте хід виконання програми, наче ви і є машина, яка його виконуватиме. Це допоможе краще зрозуміти де сховалася помилка.
Використання невідповідних структур даних
Не раз мені доводилось бачити, як студенти намагались використовувати звичайний масив, при тому, що кількість елементів заздалегідь не відома. Як і з циклами, хибне рішення на одному з етапів тягне за собою подальші проблеми.
Щоб ефективно вирішувати задачі, ви маєте розуміти розповсюджені структури даних та їх можливості.
Найбільш часто вживані структури даних:
Java | Ruby | JavaScript | |
Списки | List | Array | Array |
Набори | Set | Set | |
Карти або відображення | Map | Hash | Object |
Ви могли звернути увагу, що в Ruby та JavaScript роль списків виконують масиви. Це тому, що в цих мовах масиви є об’єктами типу Array з власним API, подібним до списків у Java. В той час як в Java масив – просто набір даних, який не має власної поведінки.
Знаючи інтерфейси основних структур даних, ви зможете будувати простіші та ефективні алгоритми. Також, вам стануть доступні вже наявні операції над ними, такі як пошук елементів та сортування.
Метод/модуль вирішує більш ніж одну задачу
Я часто бачу рішення, в яких в одному методі чи класі поєднані зчитування даних та їх використання. Це тісно зв’язує логіку сервісу зі способом його надання. Що в свою чергу ускладнює його використання з іншими підходами до введення даних (консоль, файл, http запит, використання іншою частиною програми). Також таке зв’язування значно ускладнює аналіз коду та його подальше розширення.
Пишіть код так, наче його будуть використовувати інші програмісти, і ви не знаєте як саме. Розділяйте роботу з даними на незалежні етапи. Виносьте із великих методів окремі задачі в менші методи та розподіляйте їх по класах. В ідеалі, ключова логіка вашого додатку має бути абстрагована від того, яким чином дані потрапляють у ваш додаток, та як користувач отримає результат їх обробки. Тобто, не містити деталей реалізації взаємодії з користувачем.
Написання власного коду замість використання готового API
Ігноруючи можливості бібліотек і фреймворків, ви не тільки виконуєте дурну роботу, а й створюєте складний для розуміння і розширення код. Замість того, щоб побачити вже знайомий виклик методу або передивиться його специфікацію, людині, що матиме справу з вашим кодом, доведеться розбиратися, що ж ви мали на увазі, коли порівнювали залишок від ділення на 7 з різними числами.
Ретельно вивчайте API бібліотек, які використовуєте. Більшість основних можливостей вже надані вам бібліотекою. Якщо вам здається, що задача досить поширена, і було б дивно кожен раз її реалізовувати повторно – шукайте її рішення в документації. Пишете складний код для, нібито, простої операції, що описується декількома словами – передивіться, чи не описана вона в мануалі.
Через брак досвіду та інтуїції може бути важко знайти в документації на API потрібну інформацію. В такому випадку ви можете звернутись до пошукових систем. Головне – ставте запит англійською мовою. Так ви збільшите свої шанси знайти потрібну вам інформацію.
Ще раз хочу наголосити – в будь якій справі важлива практика. Випробуйте себе на CodinGame. Це цікавий сервіс для поліпшення своїх вмінь в програмуванні. Окрім візуалізації ходу роботи вашого алгоритму, сервіс також надасть можливість підійти ітеративно до його створення. Кожне завдання супроводжується тестами, і ви можете поступово поліпшувати свій код, задовольняючи більш складні варіанти вхідних даних.
Ретельно аналізуйте повідомлення про помилки, які у вас виникають. Спочатку зрозумійте проблему, а вже потім намагайтесь її вирішити. Досліджуйте хід виконання програми. Stack trace – ваш помічник в пошуку проблем у коді.
Ми не робимо ідеальні рішення з першого разу. Та прикладаючи достатньо зусиль, ми можемо досягти кращих результатів. Успіхів вам!
2 комментария
You can post comments in this post.
Коли розпочинаеться 7-а інтернатура?
Philip 8 лет ago
Інтернатуру плануємо розпочати у липні.
Ірина Чернишова 8 лет ago
Post A Reply