Чи добре жити, не знаючи, як працює створена вами програма?


16

Я маю на увазі, є дійсно корисні лайки, які можуть вирішити проблеми, коли ви застрягли і не знаєте, як вирішити те чи інше, використовуючи свої знання мови програмування, яку ви використовуєте ... Наприклад, Boost для C ++ або JQuery для JavaScript або Spring для Java ... Вони вирішують проблеми за лічені секунди, і тобі зовсім не байдуже, як вони це зробили (незважаючи на те, що вони написані тією самою мовою, на якій ти програмуєш) ... Тож мені цікаво, що я один користуюся libs, не будучи здатний писати рішення моїх проблем з нуля чи це стандартна практика?


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

так що це нормально, щоб не знати, як вирішити поширені проблеми у відповідній області, і сказати "просто скористайтеся *** (ваша улюблена ліб тут)", це вирішило б, не вникаючи в те, як вони це зробили?
Кабумбус

1
Ви коли-небудь програмували масштабовані програми? Чесно кажучи, жодна бібліотека не є ідеальною 100% часу, і помилки неодмінно трапляються. Тепер, якщо ця помилка перебуває в одній із безлічі зовнішніх бібліотек, якими ви користуєтесь, і за 2 роки вниз по циклу розвитку ви починаєте стикатися з проблемами, і що ви знаєте? Це одна з тих бібліотек, якими ви користуєтесь! Тож, якщо чесно: ні, немає сенсу використовувати бібліотеки як швидко виправляти (принаймні, не для програмного забезпечення для корпоративного рівня тощо), оскільки вони стають певною мірою обмеженням у подальшому нижньому напрямку.
jerluc

5
@jerluc: стандартні бібліотеки часто набагато краще розроблені та підтримуються, ніж код будь-якої організації. Наприклад, bo_Share_ptr boost вважається "повинен мати" усіма в галузі, з якими я вступив у контакт, і різні інші фрагменти коду, надані прискоренням, дозволили проекту, над яким я працюю, зосередитись на деталях проблеми, а не витрачати час на роботу над деякими менш важливими речами, які вже були зроблені. Ви можете зіткнутися з проблемами внизу лінії, тому ви повинні бути вибірковістю вибраних бібліотек, але вони, як правило, хороші. Синдром "не розвинений тут" поганий.
TZHX

@TZHX Я вважаю, що я повинен бути більш чітким, кажучи, що те, що я заявив, стосується, головним чином, бібліотек, які можуть робити такі речі, як обгортання того, що можна вважати кодом "котлової пластини". Має сенс довіряти «винайденому колесо», не писати обгортки IO (коли для таких обгортків доступні бібліотеки), але не має сенсу довіряти «дещо кругле колесо», або іншими словами, бібліотеці, яка робить якась магія чорної скриньки і працює на те, що вам потрібно на той момент.
jerluc

Відповіді:


22

Це нормально не розуміти, як вирішити проблеми самостійно, а використовувати бібліотеки замість цього?

Взагалі, ні, це не так.

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

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

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


13

Одного разу computerworld.com.au запитав Bjarne Stroustrup "Чи є у вас поради щодо майбутніх програмістів?"
І він відповів"Знайте основи інформатики: алгоритми, архітектури машин, структури даних тощо. Не просто сліпо копіюйте методи з програми в програму. Знайте, що ви робите, що це працює, і чому це працює. Не думайте, що ви знайте, якою буде галузь через п’ять років або чим ви будете займатися тоді, тому зберіть портфоліо загальних і корисних навичок. Спробуйте написати кращий, більш принциповий код. Працюйте, щоб "програмування" стало більше професійної діяльності менше "хакерської" діяльності на низькому рівні (програмування - це також ремесло, але не просто ремесло) путівники та онлайн-документація - це неглибоко ".
Сподіваюся, це прояснить ваші сумніви щодо того, що потрібно дляПравда програміст і що необхідне для тих , хто буде один.


4
+1 - Я думаю, що важливо зазначити, що - хоча я на 100% погоджуюсь зі Струструпом - ОП не повинна уявляти, що це означає, що він повинен винаходити колесо для кожної окремої речі. Основна причина, чому освіта з інформатики передбачає реалізацію класу String та MergeSort та інших алгоритмів, полягає в тому, що коли ми використовуємо бібліотеки, доступні на нашій мові на вибір, ми зрозуміємо, що відбувається під кришкою. Майте справу з достатньою кількістю бібліотек, які добре розуміють основи, і можна значно передбачити, що знаходиться під кришкою бібліотеки X, Y або Z.
jmort253

Приїжджаючи від людини, якій потрібні кілька десятків абзаців, щоб ретельно проаналізувати, обґрунтувати та пояснити, чому саме конкретна марка та аромат чаю викликали його інтерес, при цьому повністю переходячи до питання початкового питання. АЛЕ я все одно люблю його!
Філіп Дупанович

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

12

Так - і ми всі це робимо!

Візьмемо, наприклад, дуже просту помилку, яку я виправляв у графічному коді, пов’язаному з Mac. Код навколо помилки включав кілька кроків:

  1. По-перше, метод Objective C виділяє піксельний буфер за допомогою malloc () і додає його до свого об'єкта Objective C.
  2. Пізніше щось трапляється, і звичайна програма C відправляє повідомлення об'єкту Objective C і отримує піксельний буфер.
  3. Процедура C стискає вміст буфера пікселів за допомогою jpeglib та надсилає його через TCP / IP-з'єднання.

Там відбувається дуже багато! Ось кілька речей:

  • Динамічний розподільник пам'яті для реалізації malloc (), який передбачає, що пам'ять фізично суміжна і лінійно адресована.
  • Базова система віртуальної пам’яті ядра Дарвіна, яка відображає як фрагментарну фізичну оперативну пам’ять, так і дисковий простір (який є фізичним пристроєм, відмінним від оперативної пам’яті), у щось, що представляється динамічним розподільником пам’яті, як фізично безперервна та лінійно адресована оперативна пам’ять.
  • Об'єктна система об'єктива C
  • Система обміну повідомленнями під час роботи Mac OS та спосіб її взаємодії з об'єктами Objective C
  • Реалізація бібліотеки jpeglib JPEG стандарту стиснення растрових зображень з втратою JPEG, який використовує дискретний алгоритм перетворення косинусів
  • Процедура мережевого простору користувачів для надсилання даних, що викликає різні протоколи TCP та IP-протоколів, що в свою чергу викликає ядро ​​ОС. Тоді, залежно від того, що ви ввімкнули для своєї мережі, він може викликати драйвер для порту Ethernet, чип wi-fi або ще незвичніше драйвер USB або Firewire.

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

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


1
Якби я зрозумів увесь код, який я використовую звичайно, мені потрібно було б зрозуміти стиснення даних, включаючи JPEG, геометричне подання даних, включаючи все у <i> Книзі Nurbs </i>, тонкощі форматів PDF та U3D та набагато більше. У мене є посилання на все, але я ніколи не буду мати все це вниз.
Девід Торнлі

Треба визнати, що я не завжди детально розумію всі будівельні блоки, які використовую для написання робочого коду, але відчуваю себе нещасною, коли це відбувається. Розуміння або принаймні знання того, що якщо мені потрібно, я можу зрозуміти основні компоненти, значно полегшує життя. Я радий, що знаю, як працює алокатор, які принципи використовуються для стиснення зображення JPEG, як працює TCP / IP, як може бути реалізована віртуальна пам'ять, як працює центральний процесор тощо. це добре, але не маючи доступу до деталей, почувається дуже погано ...
П'єр Арно

5

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

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

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


5

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


Це означатиме, що для мого поточного проекту я повинен знати деталі специфікацій PDF та U3D. Для певного проекту шкільної школи мені довелося б багато знати про певні алгоритми лінійного програмування (симплекс був би безнадійним у моєму випадку). Якби потрібно було зрозуміти, що саме робить бібліотека для того, щоб використовувати її, я ніколи нічого не зроблю.
Девід Торнлі

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

5

На вас, справді .

Чим краще ви розумієте інструменти, з якими працюєте, тим краще ви можете ними скористатися.

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

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


5

Важливо знати свою сферу та свою частину процесу.

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

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

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


2

З мого досвіду: оскільки ви не можете усунути залежність від бібліотеки, ви та ваша команда повинні знати досить, щоб вирішити проблему.

Як програмісти у нас мало часу, тому ми повинні вибрати той, який має найвищий пріоритет. Проблему потрібно вирішити якомога швидше і лагідніше. Тільки ця причина робить «навчання всього про речі» дещо зайвим.

Я хочу додати тут «залежність». Як громада, ми всі залежні від інших. Ми стоїмо на Giants, щоб створити наш додаток: Java, .NET, API ... І ми довіряємо Giants щодо їх роботи; адже це працює для такої кількості людей. Якщо у вас є проблеми з рамкою або API, є хороший шанс, що інші зіткнулися з нею десь, і є рішення / вирішення проблеми.

Єдина проблема тут: можливо, десь за обмеженими критеріями гіганти розвалилися. Наприклад, flash не підтримується в деяких ОС, і є багато речей, без яких ми не могли б обійтися. Ця можливість більше нуля, але в цьому випадку у нас є мало речей, які ми можемо зробити. Тільки в цих випадках знання про "те, що стоїть за капотами" виявляється корисним, оскільки вказує на те, де проблема справді є і може створити велику роботу; але я не впевнений, що час, який ми вкладаємо, дійсно того вартий.

Щоб вирішити цю можливість, я думаю, що є рішення: адже більшість програмістів можуть легко зловити «поверхневу роботу» бібліотеки, і лише іноді нам справді потрібен хтось, який дуже добре розуміє: нехай розділить команду, щоб це зробити. Намагаючись включати в себе команду, кожна з яких має близько 1,2 корисних бібліотек / інструментів / "наборів навичок", які брали участь : одна має хороший досвід роботи з jQuery, одна спеціалізується на базі даних ... Це допоможе значно зменшити ризики.


2

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

Зателефонувавши в Quicksort, вам слід знати про найгірший випадок. В іншому випадку зловмисник може мати можливість вводити найгірші дані та виконувати DoS.

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

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


1
Виділення буферів фіксованого розміру для чого завгодно - це переповнення буфера, яке чекає. Набагато краще використовувати мову, яка підтримує динамічні масиви та дозволяє дозволити користувачеві керувати власними буферами.
Мейсон Уілер

1

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

Однією з важких речей у програмуванні є подолання спокуси вирішити всі проблеми самостійно.


1

Це нормально, але це небезпечно. Як загальна практика, слід знати роботу над тим, що він розробив.


1

Свого роду ...

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

Сенс у тому, щоб не заплутатися з купою дрібних деталей, а просто реалізувати свою прокляту ідею вже.

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

Але не намагайтеся все розібратися, якщо у вас багато вільного часу ... Погляньте на це так. Причиною мов програмування є захист від того, що ми робимо збірний код, причиною коду асемблери є те, що захищає нас від 1 та 0. Я не думаю, що вам потрібно знати всі дрібні деталі механізму, що його стоїть, а просто знати загальну суть цього. Як і сміттєзбірник, я знаю, що він буде мати справу з моїми вказівниками / пам'яттю, мені байдуже, який чарівний акуратний алгоритм він використовує, я просто знаю, що він працює (для того, що мені потрібно), і він більше не робить. Можливо, проти цього, але мех. Якщо, звичайно, ви не в тій галузі, де вам доведеться зіткнутися з цим. Тоді ви б не ставили цього питання, бо це частина вашої роботи ха-ха.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.