Стать хорошим программистом (Часть 2): избавляемся еще от пяти привычек на пути к лучшему программированию на MQL5
Введение
Я часто использую термин "нуб" (от английского noob) в этой серии статей. Им я для простоты называю всех, у кого не очень большой опыт программирования на MQL5 (пожалуйста, не обижайтесь). Просто так удобнее. Это не означает, что статьи предназначены именно для нубов или новичков. Конечно нет! Этот материал предназначен абсолютно для всех, независимо от опыта в программировании, потому что человека делают нубом определенные программерские привычки и поведение, а не количество лет в разработке.
Предыдущая статья опубликована здесь, если вы еще не читали ее. Здесь же я продолжаю свою миссию - помочь нубам стать профессиональнее.
1. Перестаньте думать, что вы лучше других
Вероятно, вы занимаетесь программированием уже какое-то время и успели создать несколько отличных советников и индикаторов для себя, для публикации в библиотеке Code Base или для заказчиков во Фрилансе. Хорошо, если вы замечаете свой прогресс и становитесь более уверенным, что помогает вам решать более серьезные задачи и дальше развиваться. Плохо, если вами овладевает высокомерие и гордыня. Не забывайте, что:
«Гордый человек считает себя всегда вполне хорошим. От этого-то гордость особенно вредна. Она мешает человеку в главном деле жизни людей, в том, чтобы становиться лучше» (Лев Толстой).
Так легко чувствовать себя умным и критиковать чужой код, при этом даже не пытаясь до конца разобраться в нем. Или еще хуже — показывать, какой ты крутой программист, оскорбительными ответами на форуме, чтобы автор вопроса понял, насколько он плох по сравнению с тобой. Сколько раз я видел, как люди приходят на форум с вопросом, публикуют код, описывают проблему и то, как они пытались ее решить, какие действия не сработали. А потом неожиданно появляется "опытный нуб" и объясняет, что этот человек глубоко неправ, при этом не предлагая никакого решения или же предлагая еще менее адекватное решение (кусок код), чем изначальный код автора вопроса.
Вместо того, чтобы сразу кидаться на топик-стартера и разъяснять ему, что он жутко неправ, да еще и кидая ему в ответ якобы правильный код, почему бы не начать с объяснения причин проблемы, почему бы не написать подробно и четко, что можно сделать в конкретной ситуации?
Не так уж приятно быть топик-стартером, поверьте. Наверняка любой, кто создает тему на форуме, прекрасно понимает, что он где-то ошибся и именно поэтому не может получить желаемый результат. Скорее всего, автор темы — сам новичок. Возможно, он потратил часы или даже дни, пытаясь решить проблему. Уж я точно знаю каково это.
Логично, что если вы просто кинете в ответ пусть даже работающий кусок кода, в долгосрочной перспективе это не решит проблем. То же самое, что дать обезболивающее тому, кому нужна операция. Наоборот, так вы научите начинающих практически самой плохой привычке, которая стояла первой в списке в первой статье цикла — копипаст. А новичок может сделать такой вывод: "Раз это работает именно так на форуме, то я буду постить тут свой проблемный код, а мне в ответ будут давать работающий. Класс!"
Старайтесь всегда четко, подробно и доступно объяснять решения, которые будут максимально понятными и полезными для начинающих. Помните, что в мире есть и будет много начинающих, которые могут столкнуться с той же проблемой, поэтому им, вероятно, тоже понадобится ваше решение.
Примером еще одного негативного последствия, когда мы думаем, что лучше других, может служить появление неправильных ответов на форуме и неадекватных отзывов к кодам в библиотеке. Раз мы лучше, код другого может казаться недостаточно сложным, или мы уверены, что код конечно же нужно было написать совершенно по-другому. При этом мы забываем или вовсе не задумываемся, какая цель стояла перед автором, какую задачу он решал. Так появляются неоправданные негативные отзывы только потому, что мы бы сделали по-другому.
2. Будьте гибче
Перестаньте думать, что вы не сможете стать хорошим в определенной области.
«Безумие — делать одно и то же, и каждый раз ожидать иного результата» (Альберт Эйнштейн).
Не зацикливайтесь на создании одних и тех же советников, индикаторов, скриптов или чего-то еще. Это убивает творчество и креативность, а вы застреваете на одном месте. Вы сами ограничиваете свои возможности, когда думаете, что просто не были рождены, чтобы достигнуть успехов в какой-то сложной области программирования. Ваш мозг — это гибка система. Он адаптируется и меняется при поступлении новых стимулов. Чем сложнее вы ставите перед собой задачи, тем сильнее вы станете в этой конкретной теме. Вы можете стать хорошим специалистом в любой области:
- Математика
- Написание сложных советников и индикаторов
- Машинное обучение и самоадаптирующиеся системы
И вообще в любой другой сфере. Естественно, для этого нужно приложить усилия, нужно работать.
Не существует святого грааля, волшебного советника (по крайней мере, я сам не встречал) или универсального индикатора. Но это не должно вас останавливать — работайте над своими системами, совершенствуйте их, развивайте и развивайтесь сами.
Я помню, как в начале моего пути в программировании я так испугался, когда скачал из Code Base простейший индикатор, типа простого скользящего среднего, и обнаружил, что в коде более 1000 строк (а именно на длину кода я обращал внимание в первую очередь). И это для меня было слишком сложно. Думаю, многие новички сталкиваются с таким.
Сейчас у меня уже больше опыта. Сейчас я уже понимаю: да, какие-то вещи все еще могут быть сложными, но это нормально. И в жизни всегда так — трудно в начале, а со временем, со вложенными усилиями, все становится на свои места.
3. Не надо писать код просто на будущее
«Те, у кого есть знания, не предсказывают. Те, кто предсказывают, не обладают знаниями» (Лао-Цзы).
Чем меньше кода, тем
- Меньше ошибок
- Меньше времени на чтение
- Легче компилировать
- Быстрее отредактировать
- Быстрее получить готовое решение
- Проще сопровождать
- Легче проводить отладку
Вероятно, вы тоже встречали подобный код:
int MathRandInt(int mini, int maxi) { double f = (MathRand() / 32768.0); return mini + (int)(f * (maxi - mini)); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void chart_random() { //--- string background[]={"clrBlack"}; string bulls[]={"clrGreen","clrDeepPink","clrYellow","clrCrimson","clrMediumBlue","clrKhaki","clrYellow"}; string bears[]={"clrDarkViolet","clrDarkOrange","clrIndigo","clrWhite","clrSilver","clrMediumPurple","clrBlue"}; //--- ChartSetInteger(ChartID(), CHART_MODE, CHART_CANDLES); ChartSetInteger(ChartID(), CHART_SHOW_GRID, false); ChartSetInteger(ChartID(), CHART_AUTOSCROLL, true); ChartSetInteger(ChartID(), CHART_SHOW_PERIOD_SEP, true); ChartSetInteger(ChartID(), CHART_SHIFT, true); ChartSetInteger(ChartID(), CHART_SHOW_ASK_LINE, true); ChartSetInteger(ChartID(), CHART_SHOW_BID_LINE, true); ChartSetInteger(ChartID(), CHART_COLOR_ASK, clrBlue); ChartSetInteger(ChartID(), CHART_COLOR_BID, clrCrimson); ChartSetInteger(ChartID(), CHART_SCALE, 2); ChartSetInteger(ChartID(), CHART_FOREGROUND, true); ChartSetInteger(ChartID(), CHART_COLOR_FOREGROUND,clrWhite); //--- /* for (int i=0; i<ArraySize(background); i++){ int maxi=ArraySize(background); int random_=MathRandInt(0,maxi); ChartSetInteger(0,CHART_COLOR_BACKGROUND,StringToColor(background[random_])); } for (int i=0; i<ArraySize(bulls); i++){ ChartSetInteger(0,CHART_COLOR_CANDLE_BULL,StringToColor(bulls[MathRandInt(0,ArraySize(bulls))])); ChartSetInteger(0,CHART_COLOR_CHART_UP,StringToColor(bulls[MathRandInt(0,ArraySize(bulls))])); } for (int i=0; i<ArraySize(bears); i++){ ChartSetInteger(0,CHART_COLOR_CANDLE_BEAR,StringToColor(bears[MathRandInt(0,ArraySize(bears))])); ChartSetInteger(0,CHART_COLOR_CHART_DOWN,StringToColor(bears[MathRandInt(0,ArraySize(bears))])); } */ //--- int y_distance=70; int font_size=30; int width=(int)ChartGetInteger(ChartID(),CHART_WIDTH_IN_PIXELS); int padding=70; int x=width/3; //--- string label_name= MQLInfoString(MQL_PROGRAM_NAME); ObjectCreate(0, "name", OBJ_LABEL, 0, 0, 0); ObjectSetString(0,"name",OBJPROP_TEXT,label_name); ObjectSetString(0,"name",OBJPROP_FONT,"Lucida Console"); ObjectSetInteger(0,"name",OBJPROP_CORNER,CORNER_RIGHT_LOWER); ObjectSetInteger(0,"name",OBJPROP_XDISTANCE,x+padding); ObjectSetInteger(0,"name",OBJPROP_YDISTANCE,y_distance); ObjectSetInteger(0,"name",OBJPROP_FONTSIZE,font_size); ObjectSetInteger(0,"name", OBJPROP_SELECTABLE, false); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+
И этот пример не самый длинный — я встречал более 200 закомментированных строчек когда, которые почему-то хранились в программе.
MetaEditor распознает неиспользуемые переменные на уровне функций и предупреждает о наличии таких переменных. Так что вы можете выбирать — оставить их и наблюдать каждый раз подобные уведомления или удалить.
Но что касается остального кода, дальше надо проверять самим, искать и удалять неиспользуемый код.
Не используете - не нуждаетесь - удаляйте.
Неиспользуемый код только путает, делает весь код длиннее, становится труднее найти и добраться до нужных частей программы.
4. Не обязательно всегда быть правым
«Человек, который совершил ошибку и не исправил ее, совершил еще одну ошибку» (Конфуций).
Одна из основных причин, по которой нубы сразу бегут на Форум, постят код и минимальные описания того, что они хотят получить, что они сделали и что получили, в том, что они боятся слишком сильно углубляться в свои проблемы. Так делать не стоит.
Жизнь программиста полна проблем и постоянно возникающих задач. Единственный способ добиться успеха — это решать максимальное количество проблем и задач, которые вы встречаете на своем пути. Я не имею в виду, что вообще никогда не стоит писать о своих проблемах на форуме. Но постарайтесь решить проблему самостоятельно, и даже если не получится, вам будет с чем идти на форум — вы сможете понятнее описать проблему и шаги, которые вы уже испробовали. Когда вы концентрируетесь на проблеме, ищите различные способы ее решения, вы можете не только решить эту самую задачу, но и открыть для себя что-то новое.
Исправляя ошибку, убедитесь, что вы ее поняли, чтобы в следующий раз ее не допустить.
5. Не гонитесь за мгновенным успехом
«Если вы действительно присмотритесь, то большинство мгновенных успехов занимает много времени» (Стив Джобс).
Может быть такое, что вы занимаетесь программированием уже какое-то время, но постоянно возникает ощущение, что вы не куда не движетесь, что нет никакого прогресса ?
Особенно часто такое чувство может возникать у новичков, потому что большинство из них ждут мгновенных результатов. Но мир устроен по-другому.
Устройтесь поудобнее, расслабьтесь и наслаждайтесь процессом. Прогресс несомненно есть, а все сомнения — лишь часть пути, они не должны вас останавливать. Я бы посоветовал поработать над самыми любимыми проектами, от которых вы получите удовольствие и при этом будете продолжать учиться и развиваться. Будьте открыты новым идеям и возможностям (то, о чем я говорил во втором пункте).
Вложите усилия, а прогресс и развитие придут как конечный результат вашей работы.
- Читайте исходники, изучайте код, работайте с готовыми кодами из библиотеки Code Base.
- Читайте как можно больше статей на mql5.com.
- Посидите на Форуме, помогая другим участникам.
- Пробуйте разные подходы, экспериментируйте, чтобы понять, что работает именно для вас.
Запомните, успех приходит не там, где вы появляетесь время от времени. Успех будет там, куда вы вкладываетесь постоянно.
Заключение
Я и сам далеко не совершенен ни как MQL5-программист, ни как веб-разработчик. Я так же продолжаю учиться и понимаю, что процесс обучения никогда не остановится. Я всегда стремлюсь совершенствоваться и становиться лучше. А причина, по которой у меня хватило смелости поделиться идеями (то есть учить будучи студентом), заключается в том, что я хочу помогать таким же программистам, как я, стать чуточку лучше.
Давайте совершенствоваться вместе!
Перевод с английского произведен MetaQuotes Ltd.
Оригинальная статья: https://www.mql5.com/en/articles/9711
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Переводчикам респект.
После первой статьи сомневался, а теперь уверен - автор хочет объяснить программистам-дебилам, что они дебилы. Автор, не обижайтесь, но статья написана для Вас. Кроме того, то высокомерие с которым Вы обращаетесь к читателям обнуляет вашу работу.
Согласен.
Переводчикам респект.
После первой статьи сомневался, а теперь уверен - автор хочет объяснить программистам-дебилам, что они дебилы. Автор, не обижайтесь, но статья написана для Вас. Кроме того, то высокомерие с которым Вы обращаетесь к читателям обнуляет вашу работу.