Вчити себе, як фізика, стати кращим програмістом [закрито]


17

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

Однак, як і більшість фізиків, я самоучка. У мене немає широких фонових знань про те, як кодувати об'єктно-орієнтованим способом, або ім'я того конкретного алгоритму, який оптимізує пошук у якомусь дереві kD.

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

Як я вчу себе кодувати так добре, абстрактно, як випускник інформатики?

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


12
Питання: як ви знаєте, що ваш код ефективний?
Мацеманн

Я бачив багато людей, які говорять "не" на C ++ як першій мові ОО. Я вивчаю Java, і я знайшов тут відеоуроки Марка Декстера eclipsetutorial.sourceforge.net/totalbeginner.html , вони досить хороші і навчать вас TDD-способом. Також ознайомтеся з Head First Java - це досить добре в прикритті Java способом OO.
Гарв

4
@DeveloperDon, обчислення були центральною частиною фізики ще до того, як були електронні комп’ютери. Розрахунки проводилися вручну або на механічних калькуляторах. З часу Другої світової війни фізики активно займалися програмним забезпеченням. Якщо ви обчислюєте повернення комети, моделюючи вироблення нейтронів в ядерній ланцюговій реакції, або аналізуєте гігабайти даних, шукаючи ознаки Хіггса Босона, вам доведеться зробити чимале скорочення числа. Ще в 1974 році перша половина моєї лабораторії з першого курсу фізики була присвячена викладанню FORTRAN.
Чарльз Е. Грант

1
@DeveloperDon Коли фізики в ЦЕРН, наприклад, отримують дані, вони отримують дані від мільйонів зіткнень частинок. Для обробки такої кількості інформації вам потрібен комп'ютер. Розгляньте також таку область, як фізика твердого тіла, де ви намагаєтесь зрозуміти макроскопічні властивості матеріалу з мікроскопічних взаємодій атомів. У такій системі один електрон відчуває відштовхування / потяг від мільярдів ядер і електронів - а для точної характеристики такої системи потрібен швидкий комп'ютер та ефективні алгоритми (і деякі хороші наближення до фундаментальних рівнянь).
користувач787267

1
Можливо, вам слід змінити мову з C / C ++ на Python, щоб у вас було більше часу? Python часто використовується вченими , є такі модулі, як NumPy - пакет для наукових обчислень з Python або SciPy . Якщо вам потрібна швидкість C / C ++ в Python, то використовуйте Cython , це дозволяє використовувати типи та структури C / C ++, щоб ви отримали швидкість, аналогічну C / C ++, також легко інтегруватися з існуючими C / C ++ бібліотеками за допомогою Cython.
Czarek Tomczak

Відповіді:


20

Майте на увазі, що я не встигаю прочитати кілька томів на 1000 сторінок про абстрактне програмування.

Отже, ви просите, щоб хтось наділив вам п'ятиступеневий контрольний список, який зробить вас кваліфікованим програмістом? Це не відбудеться !

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

Code Complete - це хороший вступ до механіки розробки програмного забезпечення, включаючи поради щодо того, як написати та структурувати чіткий, доступний код. Так, це величезна кількість, але, звичайно, не така щільна, як кажуть, "Принципи квантової механіки" Дірака або "Гравітація" MTW. Code Complete є наближеним до того, як ви збираєтеся потрапити до п'ятиступеневого контрольного списку для написання кращого програмного забезпечення.

Matlab, VIM, C, MPI та Valgrind - чудові інструменти, які потрібно знати. Ви не згадуєте про використання системи контролю версій. Якщо якимось способом ви вже не використовуєте систему контролю версій, ви повинні почати використовувати її негайно. Контроль версій - це також відправлення богом для написання вашої дипломної роботи. Інші основні інструменти, які ви повинні знати, - це налагоджувач, провідник виконання, рамка ведення журналу та блок тестування блоку. Не потрібно читати книгу на 1000 сторінок для кожного з них. Опрацюйте онлайн-підручники, щоб отримати основи, а потім почніть працювати з ними. Поглиблюйтесь глибше в документацію, оскільки ваші потреби стають все більш досконалими.

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


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

1
Я додав би пітон в інструменти як читабельний підрахунок
Xavier Combelle

2
+1 за пропозицію Кодексу завершено. Це дійсно найкраще, що можуть прочитати спеціалісти, щоб вирішити проблему.
JW01

9

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

Головне, що я дізнався про запитання, які ви мали, поки я потрапляв сюди, - це набагато простіше отримати ці навички у інших людей, ніж намагатися їх підібрати самостійно. Досвідчений наставник може легко допомогти вам визначити, де ваш код слабкий або де загальні зразки та практики можуть вам допомогти. Хоча я навчився писати C і Objective-C самостійно, я не знав, що саме я не знав (якщо ви бачите, що я маю на увазі), поки я не працював з іншими людьми над тим самим кодом. Те, що ви просите тут поради, означає, що ви робите краще, ніж я вже робив :-).

Тепер, де ви знайдете ручного професійного інженера-програміста? Нещодавно я приєднався до MentorNet , системи, яка співпрацює з досвідченими програмістами з протезами.

Але вам не потрібно йти за такою формальною системою. Пошук місцевої групи зустрічей програміста (або куди відділ інженерії програмного забезпечення вашого університету відправляється після роботи у п’ятницю) - чудове місце для початку.


MentorNet виглядає дуже цікаво - я загляну в це. Це був важкий перехід від фізика до інженера-програміста?
користувач787267

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

5

Ніякої королівської дороги до програмного забезпечення

У стародавні часи Евкліду задавали такі питання, як ваше, його студент король Птолемей. Його відповідь: "Королівської дороги до геометрії немає".

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

Вони не відповідають вашій меті:

"Мені потрібно витратити час на фактичну фізику"

Концертний піаніст або група одного чоловіка?

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

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

Як я оцінюю, чи моя робота також хороша з точки зору програміста?

Якщо ви хочете встановити планку високою, почніть тут:

Архітектура програмного забезпечення на практиці, Лен Басс, Пол Клементс, Рік Казман

Шукайте розділ "Розуміння атрибутів якості". Крім коду, він вважає зручність використання, модифікованість, продуктивність, безпеку, доступність, надійність, тестабельність, ремонтопридатність та портативність (ви не можете їх переносити, але чи можете ви переносити дизайн з однієї платформи на іншу). Усі потребують конкретних вимірюваних цілей. Подібні посилання включають:

http://msdn.microsoft.com/en-us/library/ee658094.aspx

http://www.sei.cmu.edu/reports/95tr021.pdf

Ваші цілі проти C та C ++

Як і FORTRAN, це важкі та старі мови. Позитивні показники для C / C ++ включають:

  • Застосування з апаратними, вбудованими системами.
  • Існуючий проект, який ви хочете як відправна точка.

Є багато людей, які займаються веб-розробкою, візуалізацією даних та великими даними. Багатьох мотивують шукати або робити інші мови. Наприклад, фізик сер Тім Бернерс-Лі досяг свого успіху в галузі HTML (але про фізику це мало знає). Оцініть свою мету та мову програмування.

Подумайте про використання Matlab

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

Я сподіваюся, що успіх Matlab пов'язаний з використанням мультидисциплінарних команд з людьми, які є фахівцями з фізики, математики, електроніки та приладів, операційних систем, мов програмування, розробки програмного забезпечення, тестування програмного забезпечення, архітектури програмного забезпечення та дизайну. Аналогія може бути розтяжкою, але чому б ти поставив себе там наодинці, починаючи з молотка, зубила і лопати, щоб щось зробити, коли у вас є 3D-принтер? Як може запитати Ньютон, чому б не стати на чиєсь плече?


4

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

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

Після цього звикніть до того, що є в основі вашої мови, наприклад, для C ++ cppreference.com . Я також настійно рекомендую вам прочитати серію " Ефективні C ++ " Скотта Майєрса та " Прискорену C ++" від Koenig & Moe. Принаймні для C ++ це дасть вам міцну основу з мовної сторони.

Паралельно вам слід спробувати добре ознайомитися зі своїми інструментами. Не навряд чи ви будете розробляти свій код під Linux, тому спробуйте дізнатися, як отримати більше діагностики (попереджень) від ваших компіляторів (принаймні gcc та clang). Дізнайтеся також про інструменти статичного аналізу, такі як cppcheck або clang 's scan-build . Дізнайтеся, як зробити ці інструменти невід’ємною частиною вашого процесу розробки, наприклад, інтегруючи їх у свою програму збирання (так, ви повинні використовувати принаймні GNU make, а ще краще щось на зразок автоінструментів GNU / cmake / ...). Ви також повинні додати інструменти для профілювання у свій набір інструментів. Що стосується C ++, я настійно рекомендую вам дізнатися все, що ви можете про valgrind, який може мати профіль на дуже низькому рівні (це також може допомогти вам знайти витоки ресурсів).

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

Ви згадали C і C ++, але для чисельних обчислень я не можу рекомендувати Python з numpy та scipy досить. Це дозволяє писати чистою досить чистою мовою на дуже високому рівні (можна навіть працювати в інтерактивному режимі), одночасно користуючись надзвичайно оптимізованими процедурами, реалізованими в C, C ++ та FORTRAN. Крім того, поєднання власного C або C ++ коду з Python майже тривіально.


Дякуємо за посилання! Я обов'язково загляну в це (але я не думаю, що я встиг прочитати кілька книг - хоча я читав пришвидшений C ++ ще в середній школі). Я працюю в середовищі Unix (я використовую Vim як мій редактор і мені подобається), і я широко використовую make і Valgrind. Я також запустив опцію -pedantic у gcc та -Wall, оскільки це дуже допомагає. Можливо, я повинен був би згадати, що я роблю високопродуктивні обчислення (з бібліотекою MPI для паралельного програмування) на суперкомп'ютері університету.
користувач787267

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

Я досить часто використовую Python як передній план, щоб поговорити з процедурами, реалізованими в моєму власному C ++. З Boost це дуже просто, і ви отримуєте повну гнучкість Python (наприклад, для обробки даних для побудови графіків). Також Python досить акуратний для прототипування. Коли я знаю, що щось стає вирішальним, я завжди можу перемістити його на C ++. Оскільки ви згадуєте MPI, я б рекомендував вам провести вечір за допомогою IPython, що робить приємний інтерфейс для розподілених обчислень.
Бенджамін Баньє

@ user787267 Це вже не обов'язково правда, що Python працює повільно - подивіться, наприклад, youtube.com/watch?v=Iw9-GckD-gQ . Ключовим моментом є те, що ви можете використовувати Python для швидшого написання робочого коду, який ви можете прискорити на 1) за допомогою numpy / scipy 2) за допомогою Cython або shedskin, і 3) введення лише основного алгоритму в модуль C / C ++ або FORTRAN, якщо вам справді потрібні останні 5% покращення. Також пам’ятайте, що час, який ви витрачаєте на кодування, - це час, коли код ще не запускається, тож, можливо, колись буде ефективніше, щоб у половині часу був написаний 80-відсотковий код якості
Tobias Kienzler,

Зазвичай я виготовляю прототипи в Matlab для тестування легких речей, але я хотів на деякий час змінити Python. Я погляну на це. Через велику частину мого коду, вже написаного на C ++, я не хочу змінювати мову на півдорозі. Хоча це правда, ви також повинні враховувати програмування фактичного часу (і, повірте, я це роблю), я не думаю, що це повинно бути приводом для того, щоб не вдосконалювати свої навички програмування (поступово).
користувач787267

4

Як я оцінюю, чи моя робота також хороша з точки зору програміста?

  • Це правильно? Чи дає це правильний результат у всіх випадках?

  • Чи можуть інші люди читати та легко розуміти ваш код?

  • Коли ваш керівник каже "Чудово, тепер зробіть це також і X ..." чи потрібно вам переписати багато коду?

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

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


3

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

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

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


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

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

3

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

Критичність власного коду - один з найкращих способів покращитись. Завжди запитуйте себе:

  • Це легко змінити?
  • Це легко перевірити?
  • Чи можу я спростити це? Чи можу я легко зрозуміти це, коли побачу це знову через 3 місяці?

Іншим моїм пропозицією було б не замикатися на C / C ++. Хоча це хороші мови, які використовуються з причини, вони вимагають від вас зробити багато речей, які не стосуються предметів. Погляньте на Matlab, я був би здивований, якщо в університеті немає такого доступного для вас. Розгляньмо мову сценаріїв, як Python. Настійно подумайте про те, як вибрати функціональну мову, як Haskell - парадигма має дуже математичний характер і, швидше за все, відповідає вашим проблемам, як рукавичка. Коротше вивчіть деякі інші мови / парадигми. Навіть якщо вони не стануть постійним інструментом у вашому поясі, вони зроблять вас кращим програмістом.

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

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


2

По-перше, "елегантний" - відносний термін. Абстракція може здатися вам елегантною, але для іншого прихильника C це може здатися непотрібним. У будь-якому випадку, щоб відповісти на ваше запитання, спробуйте опублікувати свій код для ознайомлення на http://codereview.stackexchange.com .
Відмова від головної точки, кілька непотрібних порад, заснованих на моєму власному досвіді. Якщо ви можете виконати всю свою роботу лише за допомогою C, то чому ви хочете кодувати це абстрактно? Цим ви хочете дозволити іншим повторно використовувати ваш код? Якщо у вас дійсно є вагомі підстави перейти на C ++, перейдіть до абстрагування та вивчення концепцій C ++ та OO. Інакше киньте ідею. На мою скромну думку, чи не ви маєте на меті ставитись до того, щоб ваш код був більш читабельним, а ваші наукові результати були відтворюваними, ніж давати їм абстракції? У мене сама була така нав'язливість вчитися OOPS та кодувати "елегантний" лай. Але C ++ знадобиться час, щоб освоїти. Вам доведеться навчитися керуванню пам’яттю, оскільки збирання сміття не є автоматичним в C ++. Скористайтеся моєю порадою, оскільки я працював у науково-дослідній лабораторії та втратив багато часу, вивчаючи C ++ та OO,


1
Але C навіть некерований, ніж C ++. У С ++ є принаймні RAII.
Бенджамін Баньє

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

2

Враховуючи вашу згадку про відсутність часу на вивчення теорії.

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

Як ви прогресували? Бачачи кращий код, написаний іншими. Людина ніколи не знає значення "елегантності" або "хорошого" коду, якщо не бачить, що це додає цінності своїй роботі. Замість того, щоб читати теорію, я б закликав вас тримати очі відкритими для коду, написаного іншими у вашій галузі роботи. Тримайте очі відкритими для понять, які обговорюються на стакіопотоці (тег C ++). Витрачаючи лише п'ятнадцять хвилин на такий пошук, можна випадково піддавати вас поняттям, які можуть вам допомогти. Він може показати вам код, який краще записати, ніж ваш код. Саме тоді ви стежите за Вікіпедією і дізнаєтесь більше про неї. Таке навчання, яке виходить з цікавості, буде для вас набагато тривалішим і корисним, ніж теорія, яку ви забудете, коли прокинетесь наступного дня.

Також розгляньте випробування таких мов, як MATLAB або Python.


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

+1 для python @ user787267 Я не дуже спіймав, чому нерозподілити масив - це погана звичка
Xavier Combelle

2

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

Я описав важливу і недооцінену роль метафор та аналогій у програмному забезпеченні в моїй колонці CUJ "Шаблони мислення - імена, метафори, краще програмування та політика мови" . Наприклад, поняття OO про класичне успадкування часто порівнюють з передачею ознак від батьків до потомства в сім'ї. Це неправильна аналогія. Правильна аналогія класичного успадкування - біологічна класифікація організмів (наприклад, клас RedRose - це різновид квітки, а квітка - різновид рослини).

Або візьмемо для прикладу програмну концепцію ієрархічної машини машини. Хорошою метафорою тут є концепція пов'язаної квантової системи, такої як атом водню. Як ви пам’ятаєте, стани атома нумеруються трьома квантовими числами | n, l, m>, саме тому, що вони "вкладені" (ієрархічні). Ця метафора показує вам, як зрозуміти, що стани гніздяться в станах (подібно до станів імпульсу кута (l), гніздяться в енергетичних станах (n)), а також ви відразу бачите, що стан гніздування - це завжди відображення певної симетрії системи.

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

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


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

2

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

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


-5

Випускник інформатики не вміє добре кодувати, коли закінчує навчання; вони не так затребувані, коли закінчують університет. Тільки якщо вони отримають досвід.

Відповідь на ваше запитання - вам потрібно вивчити шаблони дизайну. Я програмував у Java, .NET і зараз працюю як програміст PHP, Javascript та MySQL. .NET, до речі, має дуже великий рівень абстракції, наприклад ASP.NET. Це означає, що ви можете пропустити навчання абстракції. Такі мови, як Perl, PHP тощо, мають низький рівень абстракції.

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


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