Які * є * програми програмування, які я повинен засвоїти, щоб глибоко зрозуміти своє ремесло (програмування)? [зачинено]


13

За важливістю, якщо це можливо зробити, а це не може бути, які найважливіші основи вміння програмувати. Алгоритми, ітерація, рекурсія тощо?

Зауважте, що там, де я ставлю і т.д., лежить моє питання. Нещодавно я прочитав повідомлення в Інтернеті, в якому говорилося, що 9 з 10 програмістів не можуть задихатися !

http://www.codinghorror.com/blog/2007/02/why-cant-programmers-program.html

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


3
Повідомлення Джеффа Етвуда насправді не стосується глибоких знань з програмування ... Це про те, що багатьом людям не вистачає основних, фундаментальних уявлень про програмування, і про те, як відсутність цих фундаментальних уявлень заважає їм розвивати значні навички програмування.
Роберт Харві

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

@LachlanB Я проголосував за повторне відкриття ... Для успіху потрібно ще 4 голоси
Майкл Браун

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

Відповіді:


18

Цей список є початком ... Ви задаєте велике запитання!

  • Як уточнити і записати, що хочуть клієнти («вимоги»). Це мистецтво саме по собі. Якщо ви зможете це зробити, ваша робота з програмування буде набагато кращою.
  • Як оцінювати та планувати проект. Люди попросять вас оцінити, будьте готові.
  • Як конструктивно переглянути чужий код.
  • Шаблони дизайну. Це великий. Але не надмірно використовуйте їх заради цього.
  • Дізнайтеся про різницю між запитами про помилку, проблему та функції
  • Будьте в курсі фреймворків / бібліотек. Вам не потрібно їх використовувати, але вам потрібно знати, що вони роблять та які їхні / їхні плюси. Якщо щось здається занадто важким, тоді, мабуть, є набагато простіший спосіб робити речі.
  • Як документувати складні алгоритми на блок-схемі або просто виписувати їх англійською мовою. Не чекайте, що хтось витратить 2 дні, намагаючись змінити інженерний код.
  • Як організувати структуру коду, щоб хто-небудь ще міг це зрозуміти
  • Як коментувати свій код
  • Як писати одиничні тести
  • Знайте, що відбувається під капотом. Наприклад, виклик веб-сервісу - що це насправді робить?
  • Як абстрактно відібрати логіку до класів.
  • Як змінити код рефактора
  • Вивчіть суть досить кількох мов програмування. Ви здивуєтеся тому, чого можете дізнатися з інших областей
  • Як сказати іншим програмістам, що писати.
  • Як пояснити керівництву, що ти робиш і чому.
  • Як Петро сказав, як налагодити. Я погоджуюся з усім, що він говорить, налагоджують справжні програмісти, а не просто здогадуються.
  • Як працювати з маніяками. Їх там багато.
  • Як отримати ЗРОБАННЯ СТУФА. Вся теорія у світі не допоможе тобі, якщо ти не зможеш виконати справи.

Я відповів на ще одне запитання за аналогічними ознаками (із подібним змістом) тут:

поради, вказівки, пункти, які слід пам’ятати для надання професійного коду?


1
+1: ЗРОБИТИ СТУФТ! Пару років тому я опублікував розголос, який сказав, що це визначальна характеристика інженера - вони все роблять. Іноді це не дуже, а іноді вам доведеться повертатися назад і переробляти його, але наприкінці дня вони отримують речі!
Пітер Роуелл

@PeterRowell: вам може бути цікавим цей прочитання: brandonsavage.net/when-to-write-bad-code
Marjan Venema

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

@MarjanVenema: Так, я повністю згоден з ним. Ще в 80-х роках мені було доручено написати специфікацію для нового редактора, яку слід затвердити ще до того, як я почав кодувати. Я дивився на той проклятий порожній екран більше тижня, намагаючись зрозуміти, як описати щось, чого я не розумів. Мій керівник висловив незадоволення моєю відсутністю прогресу. Після триденних вихідних у нього на столі був проект. Він запитав, що сталося, і я відповів, що писав редактор у вихідні, а потім просто написав специфікацію того, що працював. Я переписав частину коду, але це був переважно рефактор / очищення.
Пітер Роуелл

1
@YannisRizos - Мені було б цікаво написати про це блог. Чи хотіли б ви надіслати мені електронний лист із будь-якими вказівками чи мені просто щось написати?
Роклан

22

Під заголовком " тощо " йде щось, що може зайняти 50% або більше вашого часу.

Дізнайтеся, як налагоджувати.

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

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

Багато помилок є тривіальними, але їх важко помітити, оскільки ви "знаєте", яким повинен бути код ... крім того, це не так. Знайдіть фрінда, щоб пояснити це. Попросіть їх бути "експертом-ідіотом": той, хто не знає вашого коду, але той, кого ви знаєте, не може підірвати BS минулого. Не дивуйтеся, якщо посеред описуючого їм їх ви раптом зупинитесь і скажете: "і так ви можете ... бачити ... бачити, що ... ш * т. Дякую".

Нетривіальні клопи потребують арсеналу прийомів. Класика, яка може швидко помітити більшість неполадок, пов’язаних із тимчасовою хронікою, - Вольф Огорожа на Алясці. Десь на Алясці є вовк; побудувати паркан, розрізавши державу навпіл. На якій стороні вовк? Розріжте цю сторону навпіл. Натріть, промийте, повторіть. Виконуючи це в 20 разів у добре вибраних місцях у коді, зменшується площа, де може виявитися помилка (вовк) до 1/1048576. Вбийте цього вовка.

Порада: шукайте ручні хвилі - фізичні, розумові чи будь-які інші види. Як тільки ви (або ваш колега) здригнетесь / відвернете / мінімізуєте увагу, приділену частині коду, перейдіть до абсолютно несамовитості . Оскільки область, де ви просто знаєте помилку, не може бути, хоча ви витратили години / дні на пошуки речі d * mn і досі не можете її знайти ... це найбільша ймовірність розташування помилки. Ніхто не отримує "побачення" , ніхто (включаючи машину, ОС, компілятор чи ви ) не отримує будь-якого "належної поваги". Там помилка. Період. Кінець речення. Тепер іди вбий річ d * mn.

Я не знаю жодної школи, яка б не викладала налагодження як предмет до себе. ІМНСХО, це, можливо, є одним із найяскравіших доказів того, що вони (університети / професори) не вчать вас бути програмістом, вони, навпаки, вчать вас бути ... подібними до них? Суворий? Можливо, Правда? Складіть свій власний розум. Тепер доведіть це.


Вас може зацікавити Saff Squeeze - техніка, описана Кентом Беком, яка використовує тести та рефакторинг для налагодження: Hit 'em High, Hit' em Low : Тестування регресії та Saff Stisee від Кента Бека, Інститут трьох річок (Анотація: До ефективно ізолюйте дефект, починайте з тесту на рівні системи та поступово вбудовуйте та підрізайте, поки у вас є найменший можливий тест, який демонструє дефект.) Це дуже схоже на ваш Вольф-огорожа, використовуючи Тести та можливості IDEs Refactoring.
Йорг W Міттаг

1
Прекрасна відповідь - кожен може написати код, налагодити справжні програмісти.
Роклан

@ JörgWMittag: Я великий шанувальник автоматизованого тестування регресії. Я вперше застосував це в проекті пошукової системи ще в середині 80-х, і я був шокований (шокований!) Тим, що випало б після того, що виявилося "незначною" зміною на якийсь невинно виглядає шматок коду. (Примітка: це було 200 000+ SLOC C, а проблеми управління пам’яттю були основою нашого існування.)
Пітер Роуелл

3

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

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

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

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

Це, мабуть, хороший момент для початку - як алгоритми та структури даних моделюють проблеми з реального світу та як комп'ютер насправді виконує обчислення. Знання останнього дуже корисно для оволодіння мовами нижчого рівня, такими як C, які використовують набагато менше диму та дзеркал, ніж OO та мови скриптингу :)


2

ЯГНІ : "Завжди реалізовуйте речі, коли вони вам справді потрібні, ніколи, коли ви просто передбачите, що вони вам потрібні".

На мій досвід, "програмістам" властиво передбачити багато справ у майбутньому і намагатися "покращити" код, додавши коди, щоб передбачити їх! У більшості випадків доданий ними код просто розмиє код і додасть складність коду.


1

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

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

Редагувати:

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


0

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

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

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


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