Цитата Торвальда про хорошого програміста [закрито]


238

Випадково я натрапив на таку цитату Лінуса Торвальда:

"Погані програмісти турбуються про код. Хороші програмісти турбуються про структуру даних та їх зв'язки."

Я думав про це останні кілька днів, і я все ще плутаюся (що, мабуть, не є гарним знаком), отже, я хотів обговорити наступне:

  • Яке тлумачення цього можливого / має сенс?
  • Що можна застосувати / дізнатися з цього?

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

5
Можливо, якщо ви витратите час на те, щоб зробити структури даних «витонченими», тоді код не повинен складатись, щоб мати справу з цими структурами даних? Я, мабуть, занадто німий, щоб дійсно знати значення цитати Торвальда. :}
програміст

3
@RyanKinal Але, звичайно, мова має значення , оскільки це значно полегшує роботу з думками про певні структури даних. Подумайте про всі мови, які спеціалізуються, наприклад, на LISt Parsing, або мови, які мають вбудовану підтримку структур даних, які мають бути взломані іншими мовами (на увазі набори та розріджені масиви).
kojiro

83
Торвальдс у цьому, до речі, не самотній: "Покажіть мені свою блок-схему і приховайте свої таблиці, і я буду продовжувати таємничий. Покажіть мені свої таблиці, і я зазвичай не потребуватиму вашої блок-схеми; це буде очевидно. " - Фред Брукс, міфічний чоловік-місяць. "Покажіть мені свій код і прихойте ваші структури даних, і я продовжую залишати загадкою. Покажіть мені свої структури даних, і я зазвичай не потребуватиму вашого коду; це буде очевидно." та "Розумні структури даних та німий код працюють набагато краще, ніж навпаки". - Ерік С. Реймонд, Собор та базар.
Йорг W Міттаг

4
Це пояснює, чому ядро ​​Linux - це безлад :)
l1x

Відповіді:


326

Це може допомогти розглянути те, що Торвальдс сказав прямо перед цим:

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

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

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

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

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


25
найкращий код не може компенсувати погані структури даних. Хороший підбір - це правда
Конрад Фрікс,

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

2
@James: Він каже, що програмне забезпечення є кращим (отже, простішим у користуванні та використовує більшість людей), оскільки структури даних краще. Звичайно, вам не потрібно знати про структуру даних програмного забезпечення, яке ви використовуєте, але ви небайдуже ставитеся до них, навіть якщо ви цього не усвідомлюєте, тому що структури даних - це те, що рухає тим, що ви усвідомлюєте. піклуватися про.
ruakh

1
+1. Ця відповідь ставить контекст на твердження, яке в іншому випадку можна трактувати як щось інше. Кожен, хто прочитав чудовисько файлу 5000 рядків, точно знає, що я маю на увазі.
riwalk

20
" Спершу переживайте за структурами даних, і ваш код, природно, буде чистішим.": Римський державний діяч Като ( en.wikipedia.org/wiki/Cato_the_Elder ) раніше казав "Rem tene, verba sequentur" = "Очистити аргумент у ваш розум, слова будуть слідувати природним чином ". Те ж саме і з програмуванням: зрозумійте структури даних та дизайн спочатку, фактичний код буде слідувати сам собою.
Джорджіо

60

Алгоритми + Структури даних = Програми

Код - це лише спосіб вираження алгоритмів та структур даних.


Останнє видання ethoberon.ethz.ch/WirthPubl/AD.pdf
dchest

Це справедливо для процедурного програмування; в ООП дещо інакше.
m3th0dman

3
Це не принципово який - або інший. Ви маєте дані та виконуєте набір операцій над ними. Змінні та методи учасників. Точно те саме. Вся суть обчислень з 50-х років будується на тому дуже простому правилі, що програми складаються з алгоритмів, що змінюють структури даних, і це продовжує діяти 60 років потому. Ви також можете розглянути програми як функції . Вони беруть вклад, на якому вони працюють для отримання продукції . Саме так, як це роблять математичні функції.
zxcdw

31

Ця цитата дуже знайома з одним із правил у "Мистецтві програмування Unix", який Форвальд Торвальдс є творцем Linux. Книга знаходиться тут в Інтернеті

З книги наведена наступна цитата, яка пояснює те, що говорить Торвальдс.

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

Навіть найпростішу процедурну логіку люди важко перевірити, але досить складні структури даних досить легко моделювати та міркувати. Щоб побачити це, порівняйте виразність та пояснювальну силу діаграми (скажімо) дерева вказівника на п'ятдесят вузлів із схемою послідовності п’ятдесяти рядкової програми. Або порівняйте ініціалізатор масиву, що виражає таблицю перетворення, з еквівалентним оператором перемикання. Різниця у прозорості та чіткості є драматичною. Дивіться правило 5 Роба Пайка.

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

Спільнота Unix не виникла з цього розуміння, але багато код Unix демонструє його вплив. Можливість мови C, зокрема, маніпулювати покажчиками, заохочує використання динамічно модифікованих опорних структур на всіх рівнях кодування від ядра вгору. Прості погони на покажчики в таких структурах часто виконують обов'язки, які, натомість, втілення в інші мови повинні були втілювати в собі більш детальні процедури.


Я також пам’ятав це!
Jesvin Jose Jose

1
OTOH, подивіться на будь-яке питання StackOverflow int**. Це повинно переконати вас, що дані насправді НЕ очевидні; це стає лише тим, що приєднує значення до даних. І це значення в коді.
MSalters

29

Код легко, це логіка, що стоїть за кодом, який є складним.

Якщо ви турбуєтесь про код, це означає, що ви ще не отримаєте цих основ і, швидше за все, втратите комплекс (тобто структури даних та їх зв’язки).


17
Хе, мені цікаво, чи запитають наступне покоління програмістів: "Морони одного разу сказали Code is easy, it's the logic behind the code that is complex, що він мав на увазі?"
янніс

36
@YannisRizos Це буде особливо заплутано, коли люди не впевнені, чи це сказали люди, які були дебілами, чи одна людина на ім'я Морон.
KChaloux

14

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

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

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


Кожен програміст використовує програми, що генерують код. Їх часто називають "компіляторами", іноді в поєднанні з "лінкерами". Вони беруть (відносно) людський текст, що читається і читається людиною, який, як правило, (але не завжди), надається в якомусь текстовому форматі, і перетворюють його в дані, які комп'ютер може зрозуміти як інструкції та виконання.
CVn

13

Лінус означає це:

Покажіть мені свої блок-схеми [код] і прихойте свої таблиці [схему], і я продовжуватиму містифікувати; покажіть мені свої таблиці [схему], і мені зазвичай не потрібні ваші блок-схеми [код]: вони будуть очевидними.

- Фред Брукс, «Міфічний місяць людини», ч. 9.


12

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

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


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

Я також згоден. Справа в тому, що легко змінювати окремі фрагменти коду, але важче змінювати структури даних або інтерфейси між фрагментами коду (оскільки ці типи змін можуть впливати на багато речей, а не лише на одну річ).
Брендан

5

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

Однак вищі речі важливіші.

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

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

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

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

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


2

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


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

1
@kojiro: У виразі не можна побачити ліс для дерев , передбачається, що той, хто може побачити ліс, також побачить дерева (див. en.wiktionary.org/wiki/see_the_forest_for_the_trees ). Тому я думаю, що це хороша аналогія.
Треб

2

Знання того, як будуть надходити дані, важливо. Знаючи потік, потрібно створити хороші структури даних.

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

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


2

Що можна застосувати / дізнатися з цього?

Якщо можна, мій досвід останніх тижнів. Попередні дискусії пояснили відповідь на моє запитання: "чого я навчився?"

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

  • Випробувавши мою оригінальну доставку, бізнес-аналітик сказав мені, що це не працює. Ми сказали «додати 30 днів», але малося на увазі «додати місяць» ( день у отриманій даті не змінюється). Додайте окремі роки, місяці, дні; наприклад, не 540 днів протягом 18 місяців.

  • Виправлення: у структурі даних замініть одне ціле число класом, що містить декілька цілих чисел, зміна його побудови обмежилося одним методом. Змініть фактичні арифметичні висловлювання за датою - всі 2 з них.

Розплата

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

У фіксації поведінки / результатів коду:

  • Я змінив структуру даних, а не алгоритм.
  • Ніякої логіки управління не торкалося ніде в коді.
  • Жоден API не змінено.
  • Фабричний клас структури даних взагалі не змінився.

1

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


1

Не можу більше погодитися з Лінусом. Орієнтація на дані допомагає значною мірою спростити просте і гнучке рішення даної проблеми. Сам Git є підтверджуючим прикладом - надаючи так багато функцій, які підтримуються в роки розвитку, структура основних даних в основному залишається незмінною. Це магія! --2с


0

Я бачив, що це численні області.

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

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

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


0

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

якість індикатора коду = [зміни коду] / [зміни схеми бази даних]

"Покажіть мені свої блок-схеми і прихойте свої таблиці, і я продовжую бути загадкованим. Покажіть мені свої таблиці, і я, як правило, не потребуватиму ваші блок-схеми; вони будуть очевидними". (Фред Брукс)


-2

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


-4

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

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