Книга «Програмування без дурнів»

imageМожливо, ви добре знаєте про проблеми, які є у вашому коді. Можливо, у вас вже склалося уявлення про те, що потрібно чи не потрібно робити в майбутньому, щоб стати хорошим програмістом. «Немає нічого страшного в тому, що ви поганий або середній програміст, — пише Стів Макконнелл в книзі Code Complete. — Питання полягає лише в тому, як довго програміст може бути поганим або средненькая, не усвідомлюючи при цьому, що можна робити краще». Чому ж так часто складно перейти до етапу визначення проблем і знаходження способів їх усунення?

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


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

Глава 19 Не роби сам
Недосвідчені програмісти витрачають багато часу, заново винайти функції, які вже є у використовуваному ними мовою або його стандартних бібліотеках. Звісно, на перших порах неможливо отримати уявлення про всі функції конкретної мови програмування. Ніхто не буде починати вивчення мови, запам'ятовуючи всі його команди в алфавітному порядке1. Тим не менш як же без особливих зусиль визначити, де доцільно сидіти над завданням і програмувати самому, а де ви всього лише заново изобретаете велосипед (з трикутними колесами)?

Ось неповний список команд PHP, які я по незнанню написала сама:
array_rand, disk_free_space, file_get_contents, file_put_contents, filter_var,
htmlspecialchars, import_request_variables, localeconv, number_format, parse_
url, strip_tags, wordwrap.
Катрін

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

Уважні читачі розпізнають в цих проблемах зворотний бік важливих программерских чеснот, перерахованих Ларрі Уоллсом (про них ми говорили в розділі 2): ліні, нетерпіння і переоцінки власних сил. Ці якості програміста перетворюються в достоїнства лише тоді, коли фахівець починає використовувати їх до місця. Той, хто самостійно пише всі свої інструменти, не перейнявшись попереднім дослідженням, втрачає час, який можна було б витратити на створення чогось дійсно корисного, ще не існуючого. Адже перша робоча версія власної функції розрахунку дати, движка для блогу чи інструменту для обліку робочого часу пишеться на подив швидко, але варто тільки почати нею користуватися, як разюче швидко спливають якісь окремі випадки, баги, побажання щодо розширення… А коли з кодом починають працювати інші люди, його підтримка може відняти у вас величезний шматок життя. Згідно відомому емпіричному правилу досвідчений програміст з урахуванням обмірковування, тестування, налагодження, оптимізації та документування пише приблизно десять рядків відточеного коду в день (до речі, у письменників схожа ситуація). Недосвідчений розробник, ймовірно, встигне не більше.

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

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

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

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

- Дивишся список всіх функцій або функцій з певної тематичної області і сподіваєшся, що потрібна функція буде мати говорить назва. Так, функція array_rand з наведеного раніше прикладу легко відшукується в документації з мови PHP на сайті php.net в розділі «Функції масивів».

- Сверяешься з книгою, в якій перераховуються стандартні рішення. Для цього добре підходять збірники рецептів від видавництва o'reilly (в оригіналі такі книги називаються Cookbook). В них формулюються типові питання, що виникають при програмуванні, відповіді на які даються у формі рецептів.

- Забиваєш проблему в пошуковик і шукаєш рішення на таких сервісах, як stackoverflow.com, де відразу безліч користувачів пропонують рішення одне елегантніше іншого. Наприклад, я натрапив на функцію array_rand, задавши запит «how to» «random element» array php.

- Заходиш на сайти github.com або sourceforge.net і шукаєш в описах вільних проектів написаний на цікавить вас мовою. Існує величезна ймовірність того, що ваша проблема вирішувалася. Потім з'ясовуєш, як автори проекту впоралися із завданням.

- Коли накопичити певний досвід, то й у порівняно новому мовою уявляєш, які функції є в розпорядженні. Залишається уточнити їх назви і технічні деталі. Вже не доведеться формулювати в пошуковику який-небудь важкий запит на зразок «how to» «random element» array php. Замість цього достатньо запитати: array_rand in python, щоб знайти питонский еквівалент вже знайомої команди PHP.

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

» Більш докладно з книгою можна ознайомитися на сайті видавництва
» Зміст
» Уривок

Для Хаброжителей знижка 25% по купону — Comp
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.