Учить себя как физика, чтобы стать лучшим программистом [закрыто]

17

Мне всегда нравилась физика, и мне всегда нравилось кодирование, поэтому, когда я получил предложение на должность кандидата наук по вычислительной физике (детали не имеют значения, это в основном параллельное программирование для кластера) в университете, это было -брейнер для меня.

Однако, как и большинство физиков, я самоучка. У меня нет общих знаний о том, как кодировать объектно-ориентированным способом, или о названии этого конкретного алгоритма, который оптимизирует поиск в каком-то дереве кД.

Поскольку вся моя работа до сих пор была больше связана с физикой и научными результатами, у меня, несомненно, есть некоторые вредные привычки - тем более, что мое кодирование - это мое собственное, а не командная работа. Я в основном использовал C, так как он очень прост и «то, что вы пишете, это то, что вы получаете» - нет необходимости в причудливых абстракциях. Тем не менее, я недавно перешел на C ++, так как хотел бы больше узнать о возможностях, которые дает абстракция, и она довольно C-подобна (по крайней мере, по синтаксису).

Как мне научиться кодировать хорошим абстрактным способом, как выпускник компьютерных наук?

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

user787267
источник
12
Вопрос: откуда вы знаете, что ваш код эффективен?
Мацеманн
Я видел много людей, которые говорили «нет» C ++ как первому языку OO. Я изучаю Java, и я нашел здесь видеоуроки Марка Декстера eclipsetutorial.sourceforge.net/totalbeginner.html , они довольно хороши и научат вас TDD. Также ознакомьтесь с Head First Java, он довольно хорош в сокрытии Java в ОО.
Garv
4
@DeveloperDon, вычисления были центральной частью физики еще до появления электронных компьютеров. Расчеты проводились вручную или на механических калькуляторах. Со времен Второй мировой войны физики были глубоко вовлечены в программное обеспечение. Если вы рассчитываете возвращение кометы, моделируете производство нейтронов в ядерной цепной реакции или анализируете гигабайты данных в поисках признаков бозона Хиггса, вам придется много вычислять. Еще в 1974 году первая половина моей первой годовой физической лаборатории была посвящена преподаванию Фортрана.
Чарльз Грант
1
@DeveloperDon Когда, например, физики в ЦЕРНе получают данные, они получают данные о миллионах столкновений частиц. Вам нужен компьютер для обработки такого количества информации. Также рассмотрим область, подобную физике твердого тела, где вы пытаетесь понять макроскопические свойства материала из микроскопических взаимодействий атомов. В такой системе один электрон чувствует отталкивание / притяжение от миллиардов ядер и электронов - и для точного описания такой системы вам нужен быстрый компьютер и эффективные алгоритмы (и несколько хороших приближений к фундаментальным уравнениям).
user787267
1
Может быть, вы должны изменить свой язык с C / C ++ на Python, чтобы у вас было больше времени? Python часто используется учеными , есть такие модули, как NumPy - пакет для научных вычислений с Python или SciPy . Если вам нужна скорость C / C ++ в Python, тогда используйте Cython , это позволяет вам использовать типы и структуры C / C ++, чтобы вы получали скорость, аналогичную C / C ++, а также легко интегрировать с существующими библиотеками C / C ++ с помощью Cython.
Чаре Томчак,

Ответы:

20

Имейте в виду, что у меня нет времени читать несколько томов на 1000 страниц об абстрактном программировании.

Итак, вы просите кого-нибудь дать вам пятиступенчатый контрольный список, который сделает вас опытным программистом? Этого не произойдет !

Как и в любой другой дисциплине, если вы хотите стать программистом, вы должны тратить время и силы на практику и обучение. Вы учитесь писать ясный, элегантный код, написав много кода и внимательно читая код других людей. Некоторые из этих 1000 страниц томов действительно сэкономят ваше время, суммируя трудные уроки, которые извлекли другие люди. Бессмысленно думать, что вы можете стать опытным программистом как безболезненный побочный эффект получения степени доктора философии. Дело не в том, что вы не можете выйти из степени доктора философии. с безумными навыками программирования, просто это будет стоить вам времени и хлопот.

Code Complete - хорошее введение в механику разработки программного обеспечения, включая советы о том, как писать и структурировать понятный, поддерживаемый код. Да, это огромный том, но он, конечно, не такой плотный, как, скажем, «Принципы квантовой механики» Дирака или «Гравитация» MTW. Code Complete настолько близка, насколько вы собираетесь получить пятиступенчатый контрольный список для написания лучшего программного обеспечения.

Matlab, VIM, C, MPI и Valgrind - отличные инструменты для изучения. Вы не упоминаете об использовании системы контроля версий. Если по какой-то случайности вы еще не используете систему контроля версий, вы должны немедленно начать ее использовать. Контроль версий - это тоже хорошая идея для написания вашей диссертации. Другими базовыми инструментами, которые вы должны знать, являются отладчик, профилировщик выполнения, каркас ведения журналов и каркас модульного тестирования. Вам не нужно читать книгу на 1000 страниц для каждого из них. Пройдите онлайн-уроки, чтобы получить основы, а затем начните работать с ними. Погрузитесь глубже в документацию, поскольку ваши потребности становятся более сложными.

Консультирование по вопросам изучения основ информатики (в отличие от основ построения программного обеспечения) является более трудным. Вы не указываете, над какой проблемой вы работаете, разрабатываете ли вы новые алгоритмы или применяете существующие алгоритмы. В зависимости от вашей задачи исследования может быть полезен обзор основных структур данных и стандартных алгоритмов. Другие проблемы выиграли бы больше от твердого фона в численном анализе. Если вы действительно хотите изучить основы анализа алгоритма, есть несколько хороших текстов. В голову приходят Руководство по разработке алгоритмов и Введение в алгоритмы . Есть также несколько хороших вводных курсов, доступных сейчас онлайн: разработка и анализ алгоритмов и алгоритмов .

Чарльз Э. Грант
источник
Спасибо за ссылки, посмотрю. Я знаю, что не стану гуру кодирования в выходные дни, однако я ожидаю, что со временем постепенно улучшусь - особенно если я буду искать вдохновения вне физики (поскольку многие знакомые мне физики не заботятся о хороших методах кодирования).
user787267
1
Я бы добавил python в инструменты как читабельный счет
Xavier Combelle
2
+1 за предложение Code Complete. Это действительно лучшая вещь, которую опер может прочитать, чтобы решить вопрос.
JW01
9

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

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

Где же найти профессионального программного инженера? Недавно я присоединился к MentorNet , системе, которая объединяет опытных программистов с протеже.

Но вам не нужно идти на формальную систему, как это. Отличное место для начала - найти местную группу для встреч программистов (или куда департамент разработки программного обеспечения вашего университета отправляется после работы в пятницу).


источник
MentorNet выглядит очень интересно - я посмотрю на это. Был ли это трудный переход от физика к инженеру-программисту?
user787267
@ user787267 Поскольку я интересовался программированием (и уже был программистом-любителем), у меня была мотивация сделать переход так, как это звучит, как у вас, поэтому я не нашел техническую сторону сложной. То, что мне потребовалось больше времени, чтобы справиться с этим, было программное обеспечение: понимание моего места в большой проектной команде и то, кто был экспертом в том, что является большим изменением от кодирования «одинокого волка», которое я делал раньше.
5

Нет королевской дороги к программному обеспечению

В древние времена Евклиду задавал такие же вопросы, как и ваш, его ученик король Птолемей. Его ответ: «Нет никакой королевской дороги к геометрии».

Вы упомянули, что ваш руководитель смеялся бы, если бы знал, сколько времени вы тратите, пытаясь писать код, как профессиональный разработчик. Другие ответили на ваши вопросы с подробным списком вещей для изучения - от контроля версий до разработки и анализа алгоритмов.

Они не достигают вашей цели:

«Мне нужно потратить время на физику»

Концертный пианист или One Man Band?

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

Моя концепция роли доктора философии в области физики в средних и крупных проектах заключается в том, чтобы руководить идеями по определению системы, быть экспертом по теории, экспертом по предметам при создании сценариев использования и конечным пользователем / судьей в отношении результатов, генерируемых программными артефактами. Работайте в тесном сотрудничестве с лучшими разработчиками программного обеспечения, которые вы можете.

Как мне оценить, хорошо ли моя работа с точки зрения программиста?

Если вы хотите установить высокую планку, начните здесь:

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

Ищите главу «Понимание атрибутов качества». Помимо кода, он учитывает удобство использования, изменяемость, производительность, безопасность, доступность, надежность, тестируемость, поддержку и переносимость (вы не можете нести это, но можете переносить проект с одной платформы на другую). Всем нужны конкретные измеримые цели. Подобные ссылки включают в себя:

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

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

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

Как и Фортран, это жесткие и старые языки. Положительные показатели для C / C ++ включают в себя:

  • Приложение с аппаратным обеспечением, встроенными системами.
  • Существующий проект, который вы хотите в качестве отправной точки.

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

Рассмотрите возможность использования Matlab

Matlab имеет отличную базу, специализируется на математике и естественных науках. Имеет инструменты для визуализации данных. Это позволяет ученым и математикам выражать проблемы в области проблемы, а не в области решения. Matlab производит продукты для Parallel Computing Toolbox и Distributed Computing Server.

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

DeveloperDon
источник
4

Вы сможете пройти долгий путь по физике, ничего не зная о «профессиональном» стиле (если судить по опыту). Но я видел, как многие люди тратят бесконечное время, потому что они потеряли счет того, что они делали, или после того, как выросли их код в течение нескольких лет, просто заблудились в его сложности (даже в академических кругах нет «выбрасывающего» кода, но все держись намного дольше чем ты думаешь изначально).

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

После этого привыкайте к тому, что доступно в ядре вашего языка, например, для C ++ cppreference.com . Я также настоятельно рекомендую вам прочитать серию « Эффективный С ++ » Скотта Мейерса и « Ускоренный С ++ » Кенига и Мо. По крайней мере, для C ++ это даст вам прочную основу в языковой части.

Параллельно вы должны стараться лучше узнать свои инструменты. Весьма вероятно, что вы будете разрабатывать свой код под Linux, поэтому постарайтесь узнать, как получить больше диагностики (предупреждений) от ваших компиляторов (по крайней мере, gcc и clang). Также узнайте об инструментах статического анализа, таких как cppcheck или clang scan-build . Узнайте, как сделать эти инструменты неотъемлемой частью вашего процесса разработки, например, интегрировав их в настройку сборки (да, вы должны использовать хотя бы GNU make или, что еще лучше, что-то вроде GNU autotools / cmake / ...). Вы также должны добавить инструменты профилирования в ваш набор инструментов. Для C ++ я настоятельно рекомендую вам узнать все, что вы можете о valgrind, который может быть профилирован на очень низком уровне (он также может помочь вам найти утечки ресурсов).

Все это поможет вам сосредоточиться на том, что вас больше всего волнует (ваши исследования), вместо того, чтобы тратить время на поиск ошибок или бесполезную оптимизацию. Конечно, это почти невозможно продать консультанту, но они (и вы) будут впечатлены, но скорость, с которой вы сможете получить надежные результаты.

Вы упомянули C и C ++, но для числовых вычислений я не могу рекомендовать Python с достаточно numpy и scipy . Он позволяет писать на чистом, довольно чистом языке на очень высоком уровне (вы даже можете работать в интерактивном режиме), но при этом использовать преимущества чрезвычайно оптимизированных подпрограмм, реализованных в C, C ++ и FORTRAN. Кроме того, взаимодействие вашего собственного кода C или C ++ с Python почти тривиально.

Бенджамин Банье
источник
Спасибо за ссылки! Я определенно рассмотрю это (но я не думаю, что у меня есть время, чтобы прочитать несколько книг - хотя я когда-то читал ускоренный C ++ в старшей школе). Я работаю в среде Unix (я использую Vim в качестве редактора и мне это нравится), и я широко использую make и Valgrind. Я также включил опцию -pedantic в gcc и -Wall, так как она очень помогает. Возможно, я должен был упомянуть, что я выполняю высокопроизводительные вычисления (с библиотекой MPI для параллельного программирования) на суперкомпьютере университета.
user787267
Я должен также упомянуть, что Python на самом деле не вариант, так как мой код должен быть очень быстрым - хотя мне нравится, например, для построения графиков. Я также много использовал Matlab.
user787267
Я довольно часто использую 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% -ой эффективностью, написанный в два раза
быстрее
Обычно я делаю прототипы в Matlab для тестирования простых вещей, но я хотел на некоторое время перейти на Python. Я посмотрю на это. Из-за больших частей моего кода, уже написанного на C ++, я не хочу менять язык на полпути однако. Хотя это правда, вы также должны учитывать фактическое время программирования (и, поверьте мне, я знаю), но я не думаю, что это должно быть оправданием, чтобы не улучшать свои навыки программирования (постепенно).
user787267
4

Как мне оценить, хорошо ли моя работа с точки зрения программиста?

  • Это правильно? Дает ли он правильные результаты во всех случаях?

  • Могут ли другие люди читать и легко понимать ваш код?

  • Когда ваш супервайзер говорит: «Отлично, теперь сделайте так же, как и X ...». Вам нужно переписать много кода?

  • Когда вы пишете программу, становится ли она инструментом, который вы можете использовать снова и снова, или она используется один раз и выбрасывает ее?

Если вы можете ответить «да», «да», «нет» и «да, я стараюсь делать инструменты, а не разовые вычисления», то у вас уже все хорошо. Многое из того, что мы делаем как программисты, призвано помочь с вещами, перечисленными выше.

Калеб
источник
3

Ваши программы будут полностью отличаться от коммерческого исходного кода, поэтому многие хорошие практики и подходы не будут применяться в вашей повседневной разработке исходного кода. Но есть хороший способ выучить несколько советов и приемов.

Позвольте хорошему разработчику программного обеспечения проанализировать ваш код и оптимизировать его вместе. Это даст вам гораздо больше опыта и научит хорошей практике. Также просмотрите исходный код, написанный другими людьми. Ищите проекты с открытым исходным кодом на sourceforge или github и читайте их исходный код.

Но, прежде всего, подумайте, нужно ли вам на самом деле учиться чему-то новому, чтобы достичь своих целей. Если вы делаете ненужные вещи просто для того, чтобы код выглядел красивее, это не добавит ценности вашим приложениям.

Анджей Бобак
источник
Чтение и участие в проектах с открытым исходным кодом на самом деле очень хорошая идея - но кое-что я должен был бы сделать в свое свободное время (но так как я люблю программирование, это не должно быть слишком большой проблемой). Одна из причин, по которой я хочу стать лучшим программистом, заключается в том, что я не уверен, останусь ли я в академической среде. Когда мой доктор философии сделано, я мог бы просто получить работу в отрасли - и здесь должен быть востребован опытный программист. Другая причина - интеллектуальное удовлетворение от создания чего-то элегантного / красивого, например, решения действительно сложного дифференциального уравнения.
user787267
К сожалению, промышленность требует навыков, которые вы обычно не получаете в академическом развитии. Материал, который вы напишите во время своих академических исследований, обычно составляет менее 5% исходного кода коммерческого приложения.
Анджей Бобак
3

Что касается становления лучшими программистами, то здесь нет волшебной палочки. Если вы самоучка, то ключом является самосознание, которое звучит так, как будто у вас есть. Тем не менее, научиться хорошо кодировать в основном сводится к чтению и практике.

Критика собственного кода - один из лучших способов стать лучше. Всегда спрашивайте себя:

  • Будет ли это легко изменить?
  • Это легко проверить?
  • Могу ли я упростить это? Могу ли я легко понять это, когда увижу это снова через 3 месяца?

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

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

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

Майк Челлини
источник
2

Во-первых, «элегантный» - это относительный термин. Абстракция может показаться вам изящной, но другому поклоннику C это может показаться ненужным. В любом случае, чтобы ответить на ваш вопрос, попробуйте опубликовать свой код для проверки на http://codereview.stackexchange.com .
Отвлекаясь от основного, некоторые незапрошенные советы, основанные на моем собственном опыте. Если вы можете выполнить всю свою работу только с помощью C, то почему вы хотите закодировать ее абстрактно? Таким образом, вы хотите, чтобы другие могли повторно использовать ваш код? Если у вас действительно есть веская причина для перехода на C ++, перейдите к абстракции и изучите концепции C ++ и OO. В противном случае отбросьте идею. По моему скромному мнению, разве вы не должны стремиться к тому, чтобы ваш код был более читабельным, а ваши научные результаты - воспроизводимыми, чем давать ему ОО-абстракции? У меня самого была такая навязчивая идея изучать OOPS и писать код "элегантно". Но для освоения C ++ потребуется время. Вам придется научиться управлению памятью, поскольку сборка мусора не является автоматической в ​​C ++. Примите мой совет, так как я сам работал в исследовательской лаборатории и потерял много времени на изучение C ++ и OO,

hAcKnRoCk
источник
1
Но C еще более неуправляем, чем C ++. В C ++ есть как минимум RAII.
Бенджамин Банье
Мне нравится кодировать, поэтому я хочу стать лучшим программистом. Сначала я физик, а потом программист, но это не значит, что я не должен улучшать свои навыки программирования - в конце концов, если я решу опубликовать свой код вместе с научными результатами, было бы лучше иметь хороший, читаемый код.
user787267
2

Учитывая ваше упоминание о нехватке времени для изучения теории.

Если вы оглянулись на свой старый код через несколько месяцев и спросили себя: «Что за идиот написал этот код», вы добились прогресса.

Как ты прогрессировал? Видя лучший код, написанный другими. Человек никогда не знает ценности «элегантности» или «хорошего» кода, если только он не видит, что он добавляет ценность к его работе. Вместо того, чтобы читать теорию, я бы посоветовал вам не спускать глаз с кода, написанного другими в вашей сфере деятельности. Следите за концепциями, обсуждаемыми в stackoverflow (тег C ++). Потратив всего пятнадцать минут в день на такой поиск, вы можете случайно разобраться в концепциях, которые могут вам помочь. Он может показать вам код, который написан лучше, чем ваш код. Тогда вы узнаете о Википедии и узнаете о ней больше. Такое обучение, которое происходит из любопытства, будет гораздо более продолжительным и полезным для вас, чем теория, которую вы забудете, когда проснетесь на следующий день.

Также попробуйте попробовать такие языки, как MATLAB или Python.

навигационный
источник
Я очень много времени провожу на Stack Exchange - это бесценный ресурс для меня в моей повседневной работе. Я много использовал Matlab, но очень легко выработать вредные привычки, такие как предварительное выделение массивов, так как это очень простительно.
user787267
+1 для python @ user787267 Я действительно не понимаю, почему предварительное выделение массива - плохая привычка
Ксавье Комбель
2

Как физик, ставший программистом сам, я нашел свой физический опыт наиболее полезным в формировании правильных метафор для понимания концепций программного обеспечения. Эта перспектива также сделала обучение программированию более увлекательным для меня и помогла мне развить чувство «элегантности» в программном обеспечении, к которому вы, похоже, стремитесь.

Я описал важную и недооцененную роль метафор и аналогий в программном обеспечении в моей колонке CUJ «Паттерны мышления - имена, метафоры, лучшее программирование и политика языка». . Например, концепции ОО наследования классов часто сравнивают с передачей черт от родителей потомству в семье. Это неверная аналогия. Правильная аналогия для наследования классов - это биологическая классификация организмов (например, класс RedRose - это разновидность цветка, а цветок - разновидность растения).

Или возьмите, например, концепцию программного обеспечения иерархического конечного автомата. Хорошей метафорой здесь является концепция связанной квантовой системы, такой как атом водорода. Как вы помните, состояния атома нумеруются тремя квантовыми числами | n, l, m> именно потому, что они «вложенные» (иерархические). Эта метафора показывает вам, как понять, что состояния гнездятся внутри состояний (точно так же, как состояния углового момента (l) гнездятся в энергетических состояниях (n)), а также вы сразу же видите, что вложение состояний всегда является отражением некоторой симметрии системы.

Еще одна интересная аналогия из физики - «актерская модель вычислений», которая в последнее время была вновь открыта благодаря многоядерным процессорам и распределенным вычислениям в «облаке». Мне было полезно и забавно думать о событиях, которыми обмениваются субъекты с состоянием (или активные объекты), как виртуальные бозоны, такие как фотоны в КЭД или глюоны в КХД. Эта метафора объясняет фундаментальную асинхронную природу связи, обработку событий от завершения до завершения (квантовый скачок) и строгую инкапсуляцию активных объектов, которые могут взаимодействовать друг с другом только через явные промежуточные артефакты.

В любом случае, разработка системной метафоры является рекомендуемой практикой в ​​XP (eXtreme Programming), и, как физик, у вас будет преимущество в создании хороших метафор. Вы также приобретете чувство «элегантности», потому что ваше программное обеспечение унаследует концептуальную целостность от хороших метафор, которые вы применяете.

Миро Самек
источник
Хотя физика потенциально является богатым источником метафор, намерение в XP найти метафору, которая облегчает общение с локальным клиентом и другими членами команды, поэтому обычно склонны выбирать метафоры, которые более понятны.
Пит Киркхэм
2

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

Отличным ресурсом для анализатора и компилятора является PL101: создайте свой собственный язык программирования . Я до сих пор не нашел хорошего введения в функциональное программирование, но я слышал действительно хорошие вещи о SICP .

davidk01
источник
-5

Выпускник в области компьютерных наук не знает, как хорошо кодировать, когда они заканчивают; они не так востребованы, когда покидают университет. Только если они получат опыт.

Ответ на ваш вопрос: вы должны изучить шаблоны проектирования. Я программировал на Java, .NET и сейчас работаю программистом на PHP, Javascript и MySQL. Кстати, .NET имеет очень большой уровень абстракции, например, ASP.NET. Это означает, что вы можете пропустить обучение абстракции. Такие языки, как Perl, PHP и т. Д., Имеют низкий уровень абстракции.

Прочтите Head First Design Patterns, это хорошая книга. Это довольно всеобъемлющая книга. Это все, что вам нужно.

Дмитрий Маковецкий
источник
У меня есть идея, почему этот ответ был отвергнут, но, может быть, он будет полезен, если ответчики ответят почему?
Пьер Арло,