Мне всегда нравилась физика, и мне всегда нравилось кодирование, поэтому, когда я получил предложение на должность кандидата наук по вычислительной физике (детали не имеют значения, это в основном параллельное программирование для кластера) в университете, это было -брейнер для меня.
Однако, как и большинство физиков, я самоучка. У меня нет общих знаний о том, как кодировать объектно-ориентированным способом, или о названии этого конкретного алгоритма, который оптимизирует поиск в каком-то дереве кД.
Поскольку вся моя работа до сих пор была больше связана с физикой и научными результатами, у меня, несомненно, есть некоторые вредные привычки - тем более, что мое кодирование - это мое собственное, а не командная работа. Я в основном использовал C, так как он очень прост и «то, что вы пишете, это то, что вы получаете» - нет необходимости в причудливых абстракциях. Тем не менее, я недавно перешел на C ++, так как хотел бы больше узнать о возможностях, которые дает абстракция, и она довольно C-подобна (по крайней мере, по синтаксису).
Как мне научиться кодировать хорошим абстрактным способом, как выпускник компьютерных наук?
Я знаю, что мой код эффективен, но я хочу, чтобы он был элегантным и читабельным. Имейте в виду, что у меня нет времени читать несколько томов на 1000 страниц об абстрактном программировании. Мне нужно потратить время на реальные исследования, связанные с физикой (мой руководитель смеялся бы надо мной, если бы знал, что я трачу время на размышления о том, как элегантно программировать). Как мне оценить, хорошо ли моя работа с точки зрения программиста?
источник
Ответы:
Итак, вы просите кого-нибудь дать вам пятиступенчатый контрольный список, который сделает вас опытным программистом? Этого не произойдет !
Как и в любой другой дисциплине, если вы хотите стать программистом, вы должны тратить время и силы на практику и обучение. Вы учитесь писать ясный, элегантный код, написав много кода и внимательно читая код других людей. Некоторые из этих 1000 страниц томов действительно сэкономят ваше время, суммируя трудные уроки, которые извлекли другие люди. Бессмысленно думать, что вы можете стать опытным программистом как безболезненный побочный эффект получения степени доктора философии. Дело не в том, что вы не можете выйти из степени доктора философии. с безумными навыками программирования, просто это будет стоить вам времени и хлопот.
Code Complete - хорошее введение в механику разработки программного обеспечения, включая советы о том, как писать и структурировать понятный, поддерживаемый код. Да, это огромный том, но он, конечно, не такой плотный, как, скажем, «Принципы квантовой механики» Дирака или «Гравитация» MTW. Code Complete настолько близка, насколько вы собираетесь получить пятиступенчатый контрольный список для написания лучшего программного обеспечения.
Matlab, VIM, C, MPI и Valgrind - отличные инструменты для изучения. Вы не упоминаете об использовании системы контроля версий. Если по какой-то случайности вы еще не используете систему контроля версий, вы должны немедленно начать ее использовать. Контроль версий - это тоже хорошая идея для написания вашей диссертации. Другими базовыми инструментами, которые вы должны знать, являются отладчик, профилировщик выполнения, каркас ведения журналов и каркас модульного тестирования. Вам не нужно читать книгу на 1000 страниц для каждого из них. Пройдите онлайн-уроки, чтобы получить основы, а затем начните работать с ними. Погрузитесь глубже в документацию, поскольку ваши потребности становятся более сложными.
Консультирование по вопросам изучения основ информатики (в отличие от основ построения программного обеспечения) является более трудным. Вы не указываете, над какой проблемой вы работаете, разрабатываете ли вы новые алгоритмы или применяете существующие алгоритмы. В зависимости от вашей задачи исследования может быть полезен обзор основных структур данных и стандартных алгоритмов. Другие проблемы выиграли бы больше от твердого фона в численном анализе. Если вы действительно хотите изучить основы анализа алгоритма, есть несколько хороших текстов. В голову приходят Руководство по разработке алгоритмов и Введение в алгоритмы . Есть также несколько хороших вводных курсов, доступных сейчас онлайн: разработка и анализ алгоритмов и алгоритмов .
источник
Мой опыт немного похож на ваш - я был выпускником по физике, который преподавал программирование. После того, как я получил высшее образование, я взял на себя несколько вакансий в области ИТ и в конечном итоге стал инженером-программистом; включая немного времени на работу с OpenGDA (программное обеспечение, используемое для проведения экспериментов на различных сайтах синхротрона).
Главное, что я узнал о вопросах, которые у вас есть, когда я задавал здесь, - это то, что гораздо легче получить эти навыки от других людей, чем пытаться их поднять самостоятельно. Опытный наставник может легко помочь вам определить, где ваш код слаб или где вам могут помочь общие шаблоны и практики. Хотя я научился писать C и Objective-C самостоятельно, я не знал точно, чего не знал (если вы понимаете, что я имею в виду), пока не работал с другими людьми над одним и тем же кодом. Тот факт, что вы спрашиваете здесь совета, означает, что вы делаете лучше, чем я уже сделал :-).
Где же найти профессионального программного инженера? Недавно я присоединился к MentorNet , системе, которая объединяет опытных программистов с протеже.
Но вам не нужно идти на формальную систему, как это. Отличное место для начала - найти местную группу для встреч программистов (или куда департамент разработки программного обеспечения вашего университета отправляется после работы в пятницу).
источник
Нет королевской дороги к программному обеспечению
В древние времена Евклиду задавал такие же вопросы, как и ваш, его ученик король Птолемей. Его ответ: «Нет никакой королевской дороги к геометрии».
Вы упомянули, что ваш руководитель смеялся бы, если бы знал, сколько времени вы тратите, пытаясь писать код, как профессиональный разработчик. Другие ответили на ваши вопросы с подробным списком вещей для изучения - от контроля версий до разработки и анализа алгоритмов.
Они не достигают вашей цели:
Концертный пианист или 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-принтер? Как может спросить Ньютон, почему бы не встать на чьи-то плечи?
источник
Вы сможете пройти долгий путь по физике, ничего не зная о «профессиональном» стиле (если судить по опыту). Но я видел, как многие люди тратят бесконечное время, потому что они потеряли счет того, что они делали, или после того, как выросли их код в течение нескольких лет, просто заблудились в его сложности (даже в академических кругах нет «выбрасывающего» кода, но все держись намного дольше чем ты думаешь изначально).
Я бы посоветовал вам начать изучать алгоритмы и структуры данных, например, с помощью этого курса . После этого вы сможете думать о производительности на более продуктивном уровне и уметь следить, например, за статьями в Википедии.
После этого привыкайте к тому, что доступно в ядре вашего языка, например, для 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 почти тривиально.
источник
Это правильно? Дает ли он правильные результаты во всех случаях?
Могут ли другие люди читать и легко понимать ваш код?
Когда ваш супервайзер говорит: «Отлично, теперь сделайте так же, как и X ...». Вам нужно переписать много кода?
Когда вы пишете программу, становится ли она инструментом, который вы можете использовать снова и снова, или она используется один раз и выбрасывает ее?
Если вы можете ответить «да», «да», «нет» и «да, я стараюсь делать инструменты, а не разовые вычисления», то у вас уже все хорошо. Многое из того, что мы делаем как программисты, призвано помочь с вещами, перечисленными выше.
источник
Ваши программы будут полностью отличаться от коммерческого исходного кода, поэтому многие хорошие практики и подходы не будут применяться в вашей повседневной разработке исходного кода. Но есть хороший способ выучить несколько советов и приемов.
Позвольте хорошему разработчику программного обеспечения проанализировать ваш код и оптимизировать его вместе. Это даст вам гораздо больше опыта и научит хорошей практике. Также просмотрите исходный код, написанный другими людьми. Ищите проекты с открытым исходным кодом на sourceforge или github и читайте их исходный код.
Но, прежде всего, подумайте, нужно ли вам на самом деле учиться чему-то новому, чтобы достичь своих целей. Если вы делаете ненужные вещи просто для того, чтобы код выглядел красивее, это не добавит ценности вашим приложениям.
источник
Что касается становления лучшими программистами, то здесь нет волшебной палочки. Если вы самоучка, то ключом является самосознание, которое звучит так, как будто у вас есть. Тем не менее, научиться хорошо кодировать в основном сводится к чтению и практике.
Критика собственного кода - один из лучших способов стать лучше. Всегда спрашивайте себя:
Мое другое предложение было бы не привязывать себя к C / C ++. Хотя это хорошие языки, которые используются по определенной причине, они требуют, чтобы вы делали много вещей, не связанных с предметом. Посмотрите на Matlab, я был бы удивлен, если бы в университете этого не было. Рассмотрим язык сценариев, такой как Python. Настоятельно подумайте о том, чтобы подобрать функциональный язык, такой как Haskell - парадигма очень математична по своей природе и, скорее всего, подойдет вам как перчатка. Вкратце изучите некоторые другие языки / парадигмы. Даже если они не станут постоянным инструментом в вашем поясе, они сделают вас лучшим программистом.
Вы также можете посмотреть на некоторые алгоритмы. Я подозреваю, что, получив работу, вы уже сравнительно неплохо разбираетесь в этом, но алгоритмы невероятно важны при проведении численного анализа. На самом деле, я подозреваю, есть ресурсы, специально предназначенные для алгоритмов численного анализа.
Никогда не упускайте из виду вашу основную цель при написании кода. Вы должны сделать вещи. Стать лучшим программистом - один из способов сделать это. Выбор правильных инструментов для работы другой.
источник
Во-первых, «элегантный» - это относительный термин. Абстракция может показаться вам изящной, но другому поклоннику C это может показаться ненужным. В любом случае, чтобы ответить на ваш вопрос, попробуйте опубликовать свой код для проверки на http://codereview.stackexchange.com .
Отвлекаясь от основного, некоторые незапрошенные советы, основанные на моем собственном опыте. Если вы можете выполнить всю свою работу только с помощью C, то почему вы хотите закодировать ее абстрактно? Таким образом, вы хотите, чтобы другие могли повторно использовать ваш код? Если у вас действительно есть веская причина для перехода на C ++, перейдите к абстракции и изучите концепции C ++ и OO. В противном случае отбросьте идею. По моему скромному мнению, разве вы не должны стремиться к тому, чтобы ваш код был более читабельным, а ваши научные результаты - воспроизводимыми, чем давать ему ОО-абстракции? У меня самого была такая навязчивая идея изучать OOPS и писать код "элегантно". Но для освоения C ++ потребуется время. Вам придется научиться управлению памятью, поскольку сборка мусора не является автоматической в C ++. Примите мой совет, так как я сам работал в исследовательской лаборатории и потерял много времени на изучение C ++ и OO,
источник
Учитывая ваше упоминание о нехватке времени для изучения теории.
Если вы оглянулись на свой старый код через несколько месяцев и спросили себя: «Что за идиот написал этот код», вы добились прогресса.
Как ты прогрессировал? Видя лучший код, написанный другими. Человек никогда не знает ценности «элегантности» или «хорошего» кода, если только он не видит, что он добавляет ценность к его работе. Вместо того, чтобы читать теорию, я бы посоветовал вам не спускать глаз с кода, написанного другими в вашей сфере деятельности. Следите за концепциями, обсуждаемыми в stackoverflow (тег C ++). Потратив всего пятнадцать минут в день на такой поиск, вы можете случайно разобраться в концепциях, которые могут вам помочь. Он может показать вам код, который написан лучше, чем ваш код. Тогда вы узнаете о Википедии и узнаете о ней больше. Такое обучение, которое происходит из любопытства, будет гораздо более продолжительным и полезным для вас, чем теория, которую вы забудете, когда проснетесь на следующий день.
Также попробуйте попробовать такие языки, как MATLAB или Python.
источник
Как физик, ставший программистом сам, я нашел свой физический опыт наиболее полезным в формировании правильных метафор для понимания концепций программного обеспечения. Эта перспектива также сделала обучение программированию более увлекательным для меня и помогла мне развить чувство «элегантности» в программном обеспечении, к которому вы, похоже, стремитесь.
Я описал важную и недооцененную роль метафор и аналогий в программном обеспечении в моей колонке CUJ «Паттерны мышления - имена, метафоры, лучшее программирование и политика языка». . Например, концепции ОО наследования классов часто сравнивают с передачей черт от родителей потомству в семье. Это неверная аналогия. Правильная аналогия для наследования классов - это биологическая классификация организмов (например, класс RedRose - это разновидность цветка, а цветок - разновидность растения).
Или возьмите, например, концепцию программного обеспечения иерархического конечного автомата. Хорошей метафорой здесь является концепция связанной квантовой системы, такой как атом водорода. Как вы помните, состояния атома нумеруются тремя квантовыми числами | n, l, m> именно потому, что они «вложенные» (иерархические). Эта метафора показывает вам, как понять, что состояния гнездятся внутри состояний (точно так же, как состояния углового момента (l) гнездятся в энергетических состояниях (n)), а также вы сразу же видите, что вложение состояний всегда является отражением некоторой симметрии системы.
Еще одна интересная аналогия из физики - «актерская модель вычислений», которая в последнее время была вновь открыта благодаря многоядерным процессорам и распределенным вычислениям в «облаке». Мне было полезно и забавно думать о событиях, которыми обмениваются субъекты с состоянием (или активные объекты), как виртуальные бозоны, такие как фотоны в КЭД или глюоны в КХД. Эта метафора объясняет фундаментальную асинхронную природу связи, обработку событий от завершения до завершения (квантовый скачок) и строгую инкапсуляцию активных объектов, которые могут взаимодействовать друг с другом только через явные промежуточные артефакты.
В любом случае, разработка системной метафоры является рекомендуемой практикой в XP (eXtreme Programming), и, как физик, у вас будет преимущество в создании хороших метафор. Вы также приобретете чувство «элегантности», потому что ваше программное обеспечение унаследует концептуальную целостность от хороших метафор, которые вы применяете.
источник
Я могу вам сказать, что наибольшие успехи, которые я получил в плане подхода к решению проблем, были достигнуты благодаря изучению функциональных языков и синтаксических анализаторов. Оба открытия были сделаны случайно. Итак, я говорю вам сейчас, если вы действительно серьезно настроены стать лучшим программистом, тогда вам нужно изучить различные методы, используемые при написании компилятора, например парсеры и генераторы парсеров, а также научиться составлять вычисления более высокого порядка. функции.
Отличным ресурсом для анализатора и компилятора является PL101: создайте свой собственный язык программирования . Я до сих пор не нашел хорошего введения в функциональное программирование, но я слышал действительно хорошие вещи о SICP .
источник
Выпускник в области компьютерных наук не знает, как хорошо кодировать, когда они заканчивают; они не так востребованы, когда покидают университет. Только если они получат опыт.
Ответ на ваш вопрос: вы должны изучить шаблоны проектирования. Я программировал на Java, .NET и сейчас работаю программистом на PHP, Javascript и MySQL. Кстати, .NET имеет очень большой уровень абстракции, например, ASP.NET. Это означает, что вы можете пропустить обучение абстракции. Такие языки, как Perl, PHP и т. Д., Имеют низкий уровень абстракции.
Прочтите Head First Design Patterns, это хорошая книга. Это довольно всеобъемлющая книга. Это все, что вам нужно.
источник