Що повинен знати кожен програміст про програмування?


52

Будь ласка, не зупиняйтесь на технічних питаннях , уникайте поведінки, культурних, кар'єрних чи політичних питань.


7
Дивіться це також stackoverflow.com/questions/132798 / ...
pramodc84

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

Відповіді:


92
  1. Помилка знаходиться у вашому коді, а не у компіляторі чи бібліотеках виконання.

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

  3. Одночасно / багатопотокові програми важко записати і важче правильно перевірити. Найкраще делегувати стільки, скільки можливо, для сумісності бібліотек та фреймворків.

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

EDIT

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

Ще в ті часи, коли я займався розробкою C / C ++, я пам’ятаю випадки, коли нібито «помилки» оптимізатора виявилися завдяки мені / деякому іншому програмісту, який робив речі, за якими мовна мова говорить, що не мають визначених результатів. Це стосується навіть безпечних мов, таких як Java; наприклад, довго погляньте на модель пам'яті Java (JLS, глава 17).


17
Я вважаю за краще сказати "Помилка, ймовірно, у вашому коді", оскільки я кілька разів стикався з помилками в бібліотеках виконання. Я все ще не стикаюся з помилкою компілятора. +1 у будь-якому випадку
Chinmay Kanchi

29
Якщо ви ніколи не знаходили сумлінної помилки у компіляторі, ви майже не пристрасні до свого кодування. ;)
Мейсон Уілер

8
@Chinmay, @ spudd86, @Mason - так ... і я також знайшов свою частку помилок компілятора та бібліотеки за 30+ років програмування. Але, на мій досвід, 99 +% помилок виявляються (принаймні частково) виною мого коду. Моя відповідь навмисно завищує це, щоб переконатись у тому, що завжди слід заздалегідь запідозрити свій код.
Стівен С

5
Я не відчуваю ірраціонального страху, який мають люди з багатопотоковим програмуванням. Я підозрюю, що люди, які продовжують цю думку, не програмують багатопотокового коду. Це просто не так складно. Хоча +1 для всього іншого.
Стівен Еверс

4
Якщо ви працюєте над компілятором, помилка, ймовірно, і у вашому коді, і у компіляторі;)
Legooolas

84
  • Як читати код інших людей.
  • Код не існує, якщо його не встановлено в Системі контролю версій.

8
+10000, якщо я міг би коментар щодо контролю версій. Історія та реєстрація змін абсолютно незамінні, і саме тому ви повинні ставити все в керування версіями з самого початку.
Legooolas

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

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

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

плюс один для того, щоб навчитися читати код інших людей.
itsaboutcode

76

Розрахунки з плаваючою комою не є точними.



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

1
І якщо вони не знають, вони можуть бути серед безлічі людей, які щодня запитують stackoverflow.
Брайан Р. Бонді

1
@Brian: Так правда. Я хотів би, щоб був спосіб визначити питання, пояснені арифметикою з плаваючою комою. Ви можете створити програму Stack, яка щодня відображає різні питання з плаваючою точкою!
Адам Пейнтер

63

Не припиняйте вчитися.


1
Супутнє: Не переставай вірити.
Fishtoaster

3
Супутнє: Не припиняйте думати про завтрашній день.
ocodo

7
Супутнє: Не зупиняйте музику.
adamk

1
Пов'язане: Не припиняйте рухатися! Це ваше життя, продовжуйте рухатись, виправте це, ви мусите правильно це зробити!
окудо

44

Те, що # 1, що ви можете зробити для підвищення якості та ремонтопридатності вашого коду, - ЗНИЖЕННЯ ДУПЛІКАЦІЇ.


4
СУХАЙ, так! Як я можу забути? ;-)
Маньєро

Це так важливо, що я знову відповів .

Я скоріше скажу: ВІДМОВИТИ УМОВИ. Кожен час / якщо / для - потенційна помилка.
zvrba

1
Ви знаєте, найсмішніше про DRY - це те, що воно повторюється скрізь. :) +1
Біллі ONeal

39

Усунення несправностей та налагодження навичок

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

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

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


2
Я збирався опублікувати це. Так багато роботи програміста - це виправлення помилок, і багато людей, як правило, не здатні на це (особливо в коді інших).
Dov

+1 Я перейшов з javascript / php на C # і закохався в перегляд коду. Я хотів би, щоб динамічно набрані мови могли зробити набагато кращу роботу в цьому.
Еван Плейс

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

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

37
  1. Не будьте розумні; бути чітким.
  2. Використовуйте перед повторним використанням.
  3. Імена мають значення.
  4. Функція робить 1 річ і робить це добре.
  5. Мале краще, ніж велике.

2
Чи можете ви уточнити "Використовувати перед повторним використанням". Я не чув цього раніше.
Тярт

34

Основи. В даний час програмісти вивчають технології, а не поняття. Це неправильно.


Так і ні. Ти звучиш як кожен професор, який я коли-небудь мав в університеті ... всі вони ніколи не заробляли програмного забезпечення за все своє життя. Знання, без навичок марні в нашій професії.
Стівен Еверс

4
+1, так правда. Так, це люблять говорити типи веж із слонової кістки, але це не робить його менш істинним для решти нас в окопах.
МАК

2
Основи, як правопис? Its wrongповинні бути it's wrong, наприклад.
Конерак

2
Ні, такі основні принципи не стосуються помилки друку, а стосуються проблем програмування.
clrod

5
Легко вивчити кроки, щоб щось зробити, і часто важко дізнатися, коли слід ним користуватися, і ще важливіше, коли ти можеш ним користуватися, але не повинен. Підручники особливо погано показують, як, але не чому (і чому ні).
HLGEM

27

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

І він повинен знати, що він повинен готуватися, коли ці припущення порушуються.


6
конкретно заявляйте тих, хто assert()- скрізь assert()допоможе вам задокументувати свої припущення та заощадить, коли ви помиляєтесь.
Дастін

@Dustin +1 Неможливо просто запам'ятати всі ваші припущення - документуйте їх програмно, і вам точно скажуть, коли вони виявляться помилковими припущеннями.
Skilldrick

1
... якщо їх не складено з NDEBUG.


17

Вивчіть поняття . Ви можете надати Google синтаксис.


Теоретично добре, за винятком того, що Google страшний для пошуку конкретного синтаксису: пошук таких термінів, як "посилання на об'єкт" або "цей", дав результати в gazillion, і пошук ідіом типу "$?" взагалі не дають результатів.
l0b0


14

Тестування одиниць. Це чудовий спосіб кодифікувати свої припущення щодо використання коду.



13

Це важче, ніж ти думаєш.

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

Тоді ви також повинні зробити додаток теж добре.


3
Я думаю, що це джерело старої приказки: «90% роботи займає 90% часу. останні 10% займають інші 90% часу '
GSto

Я думаю, що багато людей прагнуть послідовно недооцінювати складність. "Наскільки важким може бути Х?" - відомі останні слова: /
Роман Старков

@GSto Я не хочу працювати 180% часу, 100% мені просто добре!
adamk

13

Знання домену. Специфікація ніколи не є 100%; знаючи фактичний домен, для якого ви розробляєтесь, ВЖЕ ВИЩЕ підвищить якість продукту.


13

Велика нотація O та її наслідки.


Кілька корисних посилань


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

11

Покажчики, очевидно. :)


3
Покажчики дійсно необхідні лише в підмножині мов для невеликого підмножини завдань. У більшості завдань ви можете (і повинні мати можливість) програмувати так, як ніби поняття вказівника не існувало.
Chinmay Kanchi

14
@Chinay Kanchi No. Покажчики повинні розуміти всі.
альтернатива

5
Це дійсно залежить від того, що ви маєте на увазі під вказівником. Якщо ви маєте на увазі покажчики у стилі С, якими ви можете маніпулювати (це те, що я припускав), я стверджую, що програмісту Java / C # / Python не потрібно нічого про них знати. Якщо ви маєте на увазі вказівник, як у "посиланнях" Java, тобто на вказівник, на який неможливо пограбувати, то так, деякі знання про них потрібні, хоч лише для того, щоб запобігти вам ковзання.
Chinmay Kanchi

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

5
@Chinmay: програється програміст Python / Java / C #, який не розуміє поняття покажчиків. L = [[]] * 2; L[0].append(42) Різні мови використовують різні назви, але непрямий характер є повсюдним.

11

Code Complete 2 - обкладинка для обкладинки


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

11

Дані важливіші за код.

Якщо ваші дані розумні, код може бути німим.

Тупий код легко зрозуміти. Так само розумні дані.

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


2
Ти був у мене весь шлях, поки ти не сказав "тип системи".

10

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


10

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


8

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

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

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

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


8

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


6

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





4

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


2
або дізнайтеся, як добре оцінити та довести, що ви не приймаєте гостей ...;)
Біллі Кувер

4

Має значення стиль кодування:

  • питання послідовного відступу,
  • послідовне використання пробілу (наприклад, навколо операторів) має значення,
  • послідовне розміщення {} s питань,
  • правильно вибрані ідентифікатори мають значення,
  • тощо.

... і хороший дизайн має значення.

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

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