Страницы

Поиск по вопросам

четверг, 5 декабря 2019 г.

Как передать данные между экранами в Чистой архитектуре?

#android #архитектура


Исходные классы: 
EventListPresenter и EventFiltersPresenter - презентеры, EventRepository - репозиторий,
EventFilters - java класс, который содержит поля фильтров.

Задача:

EventListPresenter должен уметь отображать Event по фильтрам. Пользователь настраивает
фильтры на отдельном экране. После настройки фильтров нажимает кнопку "Применить" и
переходит обратно на экран со списком, но уже должны примениться новые фильтры. Как
это правильно сделать в Чистой архитектуре? 

Слышал, что делать это через ActivityOnResult  - плохая практика, можете объяснить
почему и как правильно, если можно с примером (псевдокод)? 
    


Ответы

Ответ 1



Чистая архитектура говорит только о зависимостях между слоями приложения (бизнес логика ничего не знает о внешнем представлении и так далее). Понятие "экранов" в приложении относится к презентейшн слою, который можно реализовать различными MV* паттернами. Например MVP. Самое удобное и правильное для передачи событий между экранами (то есть между их презентерами) - создать общую модельку CurrentFilter с текущим фильтром в памяти. Тогда EventListPresenter подпишется на обновления этой модельки и будет реагировать на изменения фильтра, то есть запрашивать новые данные из репозитория. А EventFiltersPresenter будет менять фильтр внутри этой модельки. Есть множество способов это реализовать, но наиболее распространенным является использование CustomScoup Dagger 2. То есть первый презентер EventListPresenter при инициализации создаст CurrentFilter, а при уничтожении очистит. Так как второй экран запускается заведомо после EventListPresenter, то для него CurrentFilter уже будет доступен. Использование onActivityResult допустимо для запуска внешних приложений типа камеры, тогда результат полученный в Intent передается презентеру и дальше уже обрабатывается там. В других случаях это менее удобно, так как передавать можно только серелизуемые данные и в ответственность Активити попадает еще и логика передачи данных кроме отображения.

Ответ 2



Если вы хотите следовать принципам "чистой архитектуры", под которой имеется ввиду строгое распределение на слои, каждый из которых отвечает только за свой конкретный отрезок работы (Single Responsibility), то использоваеonActivityResult нарушает как раз нарушает принцип единой ответственности слоя. Рассмотрим распостраненный вариант архитектуры: View -> Presenter -> Repository -> Model Каждый знает только о следующем и/или предыдущем слое. То есть Model ничего не знает о Presenter и View. На всякий случай уточню, что View это зачастую Activity или Fragment. И тут непресредственно ответ на Ваш последний вопрос: onActivityResult вернет Вашу модель во View (который ответственный за вызов новых экранов), то есть в слой, который как бы за модель не ответственный. Если придерживаться такой архитектуре, то используется interactor. Обычно он представляет собой интерфейс, с одним методом interaction(), который выполняет задачу и передает данные/модели средствами Event bus, который "слушает" нужные события в нужных местах. Своим ответом я не заявляю о правильности использования только такого подхода. Такие вопросы всегда являются повод демагогий и бесконечных обсуждений, но в итоге все соглашаются, что к правильной (значит гибкой, расширяемой и взаимозаменяемой) архитектуре надо стремиться, но единственного правильного варианта нет, а каждый выбирает что ему удобнее. Рекомендую ознакомиться с архитектурным гайдом от гугла, который был представлен на Google I/O 2017.

Команда для вывода топ 10 приложений, использующих ОЗУ системы

#linux #bash #terminal #gnu


Желаемо в terminale при вводе top10 выводился список 10 самых память потребляемых
приложений. Наподобие:

1  firefox 1025Mb 
2  chrome  800Mb 
3  apache  600Mb
...
10 nginx   100Mb

    


Ответы

Ответ 1



Как отсортировать вывод - уже показали. Но только оно решает немного другую задачу:) Решим задачу правильно. Для начала выведем то, что нас просили ps -e -o rss,command | awk '{arr[$2]+=$1}END {for (i in arr) print i"\t"arr[i]/1024"Mb"}' | sort -k 2 -n -r | head | nl Разберем по "пайпам" (палочкам). вначале выведем список процессов и сколько памяти они скушали. потом awk магия поможет нам сделать "group by". Это нужно потому, что некоторые процессы (например, хром) любят разбиваться на сотни мелких процессов. И вроде память не кушают, а памяти нет. Также awk преобразует это в мегабайты потом sort все нам красиво отсортирует по колонке с памятью. head отберет 10 толстых и nl добавит счетчик. Последний шаг. Хочется, чтобы команда top10 была доступна. Воспользуемся псевдонимом (алиасом): alias top10='ps -e -o rss,command | awk '"'"'{arr[$2]+=$1}END {for (i in arr) print i"\t"arr[i]/1024"Mb"}'"'"' | sort -k 2 -n -r | head | nl' Теперь в эмуляторе терминале доступна команда top10, но после перезапуска эмулятора терминала, она пропадет. Для того, чтобы она не пропадала, нужно добавить наш новый алиас в конфигурационный файл вашей оболочки (bash, zsh, fish и т.д.) и обновить его (в зависимости от вашей оболочки), например: source .bashrc или source .zshrc.

Ответ 2



Используйте следующую команду: ps aux --sort -rss Здесь вы можете узнать больше об использовании памяти в Linux

Ответ 3



Если вас интересует сколько памяти освободится, если убить процесс, то вам нужна величина USS ("Unique Set Size"), а не RSS ("Resident Set Size"), показываемый ps/top. USS может выводить smem утилита: smem --sort=uss --reverse --abbreviate --columns="name uss" --no-header | head | nl Пример вывода: 1 thunderbird 356.6M 2 compiz 343.2M 3 firefox 318.6M 4 emacs 279.5M 5 calibre 158.1M 6 yandex_browser 154.0M 7 chromium-browse 150.5M 8 dropbox 125.4M 9 yandex_browser 125.4M 10 yandex_browser 92.1M

Ответ 4



ps axo pid,rss,cmd --sort=-rss | head -n 11 | tail -n +2 "-" перед rss, отсортирует по убыванию; -n 11 потому что выведет шапку первой строкой и только потом 10 процессов -n +2 чтобы вывести со второй строки

Анимация без использования JQuery

#javascript #анимация


Как сделать функцию JQuery animate без JQuery? С CSS свойствами всё понятно: их можно
через transition и animation нарисовать, но как мне плавно изменить HTML?

Как мне плавно в течении 3-ёх секунд изменить значение прогресс бара и цифру возле
него? Т.е. как плавно изменить ширину и значение возле бара с 10% до 80% за 3 секунды?



.progress {
  display: inline-block;
  width: 200px;
  height: 12px;
  border: 1px solid black;
  border-radius: 6px;
  overflow: hidden;
}
.progress_bar {
  display: inline-block;
  width: 10%;
  height: 14px;
  background-color: #3f51b5;
}

.progress_val {
  display: inline-block;
}
10%


Ответы

Ответ 1



В JS есть специальная функция requestAnimFrame, которая позволяет создать анимационные эффекты. // Указываем начальное время анимации var start = performance.now(); requestAnimationFrame(function animate(time) { // Высчитываем процент завершённости: высчитываем сколько прошло времени и делим на нужную продолжительность var timeFraction = (time - start) / 3000; if (timeFraction > 1) timeFraction = 1; // Получаем элементы var Bar = document.querySelector('.progress_bar'), Val = document.querySelector('.progress_val'); // Указываем начальное значение var oldVal = 10, // Указываем новое значение newVal = 80; // Применяем Bar.style.width = (oldVal + ((newVal - oldVal) * timeFraction)) + '%'; Val.innerHTML = (oldVal + ((newVal - oldVal) * timeFraction)) + '%'; // Если анимация незаконченна, запускаем новый шаг if (timeFraction < 1) { requestAnimationFrame(animate); }; }); .progress { display: inline-block; width: 200px; height: 12px; border: 1px solid black; border-radius: 6px; overflow: hidden; } .progress_bar { display: inline-block; width: 10%; height: 14px; background-color: #3f51b5; } .progress_val { display: inline-block; }
10%
Подробнее про создание анимаций с помощью этой функции: https://learn.javascript.ru/js-animation. Так же следует использовать полифиллы, т.к. эта функция начинает работать только в IE10. Полифилл: window.requestAnimFrame = (function(){ return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || function( callback ){ window.setTimeout(callback, 1000 / 60); }; })(); Или же можно воспользоваться готовым плагином. К вашему вопросу подойдёт и самый простой плагин. К примеру, можно использовать мой: https://github.com/yuri-spivak/animations-in-javascript new Animate({ duration: 3000, step: function (p) { // Получаем элементы var Bar = document.querySelector('.progress_bar'), Val = document.querySelector('.progress_val'); // Указываем начальное значение var oldVal = 10, // Указываем новое значение newVal = 80; // Применяем Bar.style.width = (oldVal + ((newVal - oldVal) * p)) + '%'; Val.innerHTML = Math.round(oldVal + ((newVal - oldVal) * p)) + '%'; } }); .progress { display: inline-block; width: 200px; height: 12px; border: 1px solid black; border-radius: 6px; overflow: hidden; } .progress_bar { display: inline-block; width: 10%; height: 14px; background-color: #3f51b5; } .progress_val { display: inline-block; }
10%
step – вызывается при каждом шаге анимации и возвращает процент завершённости анимации

Ответ 2



Есть вариант и с помощью CSS получить желаемый результат, но его лучше не использовать, т.к. не все браузера поддерживают изменение анимацией content у before и вообще это очень накладно .progress { display: inline-block; width: 200px; height: 12px; border: 1px solid black; border-radius: 6px; overflow: hidden; } .progress_bar { display: inline-block; width: 10%; height: 14px; background-color: #3f51b5; animation-fill-mode: forwards; animation-name: newwidth; animation-duration: 3s; } @keyframes newwidth { from {width: 10%;} to {width: 80%;} } .progress_val { display: inline-block; } .progress_val:before { content: '10%'; animation-fill-mode: forwards; animation-name: newbefore; animation-duration: 3s; } @keyframes newbefore { from {content: '10%';} 1.4% {content: "11%";} 2.8% {content: "12%";} 4.2% {content: "13%";} 5.6% {content: "14%";} 7% {content: "15%";} 8.4% {content: "16%";} 9.8% {content: "17%";} 11.2% {content: "18%";} 12.6% {content: "19%";} 14% {content: "20%";} 15.4% {content: "21%";} 16.8% {content: "22%";} 18.2% {content: "23%";} 19.6% {content: "24%";} 21% {content: "25%";} 22.4% {content: "26%";} 23.8% {content: "27%";} 25.2% {content: "28%";} 26.6% {content: "29%";} 28% {content: "30%";} 29.4% {content: "31%";} 30.8% {content: "32%";} 32.2% {content: "33%";} 33.6% {content: "34%";} 35% {content: "35%";} 36.4% {content: "36%";} 37.8% {content: "37%";} 39.2% {content: "38%";} 40.6% {content: "39%";} 42% {content: "40%";} 43.4% {content: "41%";} 44.8% {content: "42%";} 46.2% {content: "43%";} 47.6% {content: "44%";} 49% {content: "45%";} 50.4% {content: "46%";} 51.8% {content: "47%";} 53.2% {content: "48%";} 54.6% {content: "49%";} 56% {content: "50%";} 57.4% {content: "51%";} 58.8% {content: "52%";} 60.2% {content: "53%";} 61.6% {content: "54%";} 63% {content: "55%";} 64.4% {content: "56%";} 65.8% {content: "57%";} 67.2% {content: "58%";} 68.6% {content: "59%";} 70% {content: "60%";} 71.4% {content: "61%";} 72.8% {content: "62%";} 74.2% {content: "63%";} 75.6% {content: "64%";} 77% {content: "65%";} 78.4% {content: "66%";} 79.8% {content: "67%";} 81.2% {content: "68%";} 82.6% {content: "69%";} 84% {content: "70%";} 85.4% {content: "71%";} 86.8% {content: "72%";} 88.2% {content: "73%";} 89.6% {content: "74%";} 91% {content: "75%";} 92.4% {content: "76%";} 93.8% {content: "77%";} 95.2% {content: "78%";} 96.6% {content: "79%";} to {content: '80%';} }


Динамическое создание градиента вдоль пути SVG

#javascript #html #css #svg #анимация


Я динамически создаю  путь, используя  SVG. Далее я хочу добавить градиент к своему
пути, но я застрял.    

Как я пытался сделать, показано на изображении 2. Мой градиент идет вдоль пути, но
мне нужно, чтобы градиент имел вид, как на изображении 1.   

   

Изображение 1   

    

Изображение 2    

Мои определения gradient и stroke следующие:     




  
        
            
            
            
        
    





скрипт    



svgPath.setAttribute("stroke", "url(#grad1");`
svgPath.setAttribute("fill", "none");
svgPath.setAttribute("stroke-linejoin", "round");`
svgPath.setAttribute("stroke-width", "10");
});



    


Ответы

Ответ 1



Решил привести пример анимации появления polyline, пришлось заключить animate в каждый polyline, чтобы получить нужный результат, а далее можно кастомизировать анимацию, как душа пожелает(имею ввиду изменение местоположения(from="N,N etc."): polyline { stroke-linejoin: round; fill: none; animation: opac 3s 1; } @keyframes opac { from { opacity: 0; } to { opacity: 1; } }

Ответ 2



Вы не можете сделать градиент вдоль всего пути, поворачивая его по углам, так как вы хотите. Если вместо этого вы просто хотите сделать так, чтобы градиент был ориентирован вертикально, то вам нужно использовать атрибуты x1, y1, x2 и y2 для установки строки, вдоль которой выполняется градиент. Если вы не укажете эти атрибуты, градиент ориентирован горизонтально в соответствии с вашим вторым изображением. Если вы хотите иметь эффект «трубы», похожий на градиент, то самым простым способом является многоуровневый путь с разной шириной строк. svg { stroke-linejoin:round; fill:none; } Прим. переводчика Я выбрал этот относительно простой топик для перевода, так как здесь использована оригинальная техника имитации градиента вдоль сложного пути, которая может быть использована на практике и для реализации эффекта анимации постепенного заполнения труб и других емкостей. Источник: Creating a layer of gradient within an SVG path dynamically @Paul LeBeau

Ответ 3



Вариант анимации polyline svg { stroke-linejoin:round; fill:none; } Вариант анимации path Переводим координаты polyline в координаты path Всем патчам, которые отвечают за оттенки псевдоградиента присваиваем одинаковый класс class-"poly" анимируем все патчи одновременно, используя атрибуты stroke-dasharray, stroke-dashoffset svg { stroke-linejoin:round; fill:none; } .poly { stroke-dasharray: 850 850; stroke-dashoffset: 850; animation-duration: 7s; animation-name: draw; animation-iteration-count: infinite; animation-direction: alternate; animation-timing-function: linear; } @keyframes draw { from { stroke-dashoffset: 850; } to { stroke-dashoffset: 0; } }

Как сделать радиус окружности у этих углов?

#html #css #css3 #svg #анимация




Я использую svg path. Мне нужно,чтобы была возможность  отрегулировать длину svg.   

Вот мой код: 



  
       
        
         
         
         
        
        
      
    




Мне надо закруглить эти края. Как мне это сделать?


    


Ответы

Ответ 1



Длина в этом случае регулируется атрибутом path - stroke-dashoffset При максимальном значении этого параметра равного длине окружности линия будет полностью скрыта. При минимальном значении -stroke-dashoffset="0" -линия будет полностью нарисована. При радиусе окружности 45px вашего патча полная длина окружности будет равна - 2 * 3.14 * 45 = 282.6px Изменяя значения от 282.6px до нуля можно анимировать прорисовку линии. Фоновую картинку лучше размещать внутри файла svg. В этом случае она будет адаптивна и верстка не сломается при изменении размеров окна браузера. Анимация линии - клик по картинке .container { width:50%; height:50%; } svg path { stroke-linecap:round; stroke-width:5; fill-opacity:0.5; fill:none; stroke: url(#Gradient1); }
Я сделал, как у вас на картинке - непоную прорисовку круга. Поэтому stroke-dashoffset изменяется от максимального значения 282.6; до промежуточного 62.783 Это параметр - values="282.6;62.783" Для полной прорисовки круга необходимо задать values="282.6;0 .container { width:50%; height:50%; } svg path { stroke-linecap:round; stroke-width:5; fill-opacity:0.5; fill:none; stroke: url(#Gradient1); }
Решение CSS Принцип действия тот же,- анимация атрибута stroke-dashoffset. Но атрибуты патча и правила реализующие анимацию перенесены в CSS stroke-dasharray:282.6; stroke-dashoffset:282.6; animation:dash 5s ease-in forwards; } @keyframes dash { 0% { stroke-dashoffset:282.6; } 100% { stroke-dashoffset:0; } .container { width:50%; height:50%; } svg path { stroke-linecap:round; stroke-width:5; fill-opacity:1; fill:none; stroke: url(#Gradient1); stroke-dasharray:282.6; stroke-dashoffset:282.6; animation:dash 5s ease-in forwards; } @keyframes dash { 0% { stroke-dashoffset:282.6; } 100% { stroke-dashoffset:0; } }


Ответ 2



Нужно добавить атрибут stroke-linecap="round" в патч.

Как сделать анимацию чёрных силуэтов

#html #svg #анимация


Необходимо сделать анимацию пары черных силуэтов. 

Код svg: 






	






Анимация уменьшения, увеличения прозрачности не подходит.
    


Ответы

Ответ 1



Вариант анимации силуэтов с добавлением анимации градиентов фона .play-audio { position:absolute; top:0%; right:0%; }
Live Demo

Ответ 2



Основная идея - сделать прорисовку контуров с помощью изменения атрибута патча stroke-dashoffset с последующим изменением цвета заполнения фигур. Силуэты черные, потому что не указан параметр fill у патча, который по умолчанию имеет чёрный цвет. Чтобы убрать дефолтную заливку назначаем fill="none" Файл svg имеет большой размер. Оптимизируем его с помощью Svg-editor Для анимации контуров фигур необходимо узнать их длину ` Полученное значение длины линии - 8263px Формула анимации прорисовки линий силуэтов: Код анимации заливки цветом Она начнется через 20 секунд, после начала анимации прорисовки линий Добавлено музыкальное сопровождение Ниже полный код: Смотреть лучше в полноэкранном режиме

Как развиваться в олимпиадном программировании? [закрыт]

#cpp #алгоритм #олимпиада


        
             
                
                    
                        
                            Closed. This question is opinion-based. It is not currently
accepting answers.
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            Want to improve this question? Update the question so
it can be answered with facts and citations by editing this post.
                        
                        Closed 1 месяц назад.
                                                                                
           
                
        
С недавнего времени меня очень зайтересовало олимпиадное программирование.  

Я учусь на первом курсе.
Основы языка и несложные алгоритмы я уже выучил.
Но вот как мне дальше развиваться не знаю.  

Что учить?
 Где учить?
Где можно поучаствовать?
 Какие-нибудь курсы?
 Какие-нибудь форумы? 



Буду очень признателен если кто-то поможет.
    


Ответы

Ответ 1



Выскажу своё мнение, так как много лет занимался олимпиадами и был участником чемпионата мира по программированию (19-е место). Сейчас я программист-математик в довольно узкой области, но владею этой областью как профессионала международного уровня. Не смог бы стать таким профессионалом если бы вовремя не соскочил с иглы олимпиад. Первое, что вы обязаны понимать: олимпиады - это игра. Она полезная, развивает некоторые полезные навыки программирования и немаловажную способность к оптимизации. Когда я закончил играть в эту игру лет 13 назад, я был удивлён тому, насколько лучше любых других программистов я умею писать быстрый и эффективный код, который они даже представить себе не могли (когда речь идёт о сложных задачах). Но главное в этой игре - ВОВРЕМЯ УЙТИ. В один прекрасный момент вы должны понять, что наступила точка насыщения, после которой вместо развития начинается деградация. Вы начинаете работать уже не на развития своих навыков, а на оттачивание до совершенства именно соревновательных навыков, которые на реальной работе не нужны и даже вредны. Второе: олимпиадники не способны решать задачи, на которые нужно потратить больше 5 часов времени. Сколько я не преподавал, ни разу не попался человек, успешный в олимпиадах, но при этом способный решать сложные научные задачи. Они привыкли, что можно написать некий просто хороший код, эффективнее которого не смогут написать почти 100% обычных программистов, и этого достаточно. Но нет, в научных расчётах попадаются такие задачи, которые нужно пробивать месяцами упорного труда типа "написал - стёр - написал заново", этот цикл может длиться десятки итераций и приходится применять те приёмы, которые НЕ нужны в олимпиадах. Они этого не умеют. И, что ужасно, не могут себя заставить переучиться с игры на кропотливый труд. Третье: олимпиадники не способны писать грамотный промышленный код. Их можно этому научить, но не всегда получается. Да, их код очень хорош в плане эффективности, они чувствуют код как свою часть тела и знают как он будет работать. Многие из них даже не делают ошибок в коде - он сразу запускается и работает правильно (так было у меня лет 13 назад, код на домашних тренировках я писал в "блокноте" (без плюсов) и он сразу компилировался и работал без ошибок, можно даже не проверять, но этот навык не нужен и быстро теряется). Но одна беда: этот код не понятен другим людям, он не структурирован так, чтобы в нём легко можно было разобраться, чтобы заменить одну часть кода другой, его ВООБЩЕ невозможно поддерживать, можно только удалить и написать заново. Четвёртое: из второго и третьего пунктов следует важная деталь - параллельно с олимпиадами нужно работать над реальными задачами, имеющими практический смысл. Это могут быть игры (обязательно по правилам разработки игр, а не самопал), могут быть научные расчёты (обязательно по правилам той научной лаборатории, где работаете), могут быть промышленные задачи (по ВСЕМ правилам промышленного кода и разработки программного обеспечения). Только так вы не станете развитым лишь на один бок и не будете мучиться в своей профессиональной карьере. Пятое. Не впадайте в демонизм и не пытайтесь унижать своих собратьев, не прошедших олимпиадную школу. Они никогда не напишут какой-нибудь алгоритм Форда-Фалкерсона так, чтобы он работал быстро и правильно, у них в голове нет 70-100 алгоритмов, которые вы можете быстро напечатать за несколько минут, они даже не слышали, что такое максимальный поток, а вы знаете 15 алгоритмов его поиска наизусть. Это приводит к ощущению какой-то возвышенности и важности. На самом деле вы должны понимать главное: в реальной жизни вы - бесполезный мусор, если не умеете решать реальные задачи. Держите этот момент в голове, если захотите кого-то унизить, кто не знает что такое динамическое программирование, например. Шестое. Развитие вас как олимпиадника должно быть постоянным, нельзя останавливаться. Обязательно посещайте сборы программистов-олимпиадников, таких сейчас много, и когда нет сборов, каждый день решайте задачи с разных серверов. В наше время были популярными acm.timus.ru и acm.sgu.ru, сейчас я даже не знают, работают ли они, но сейчас полно других вариантов: topcoder, codeforces (загуглите). Без сборов ваше обучения будет очень слабым. Без каждодневных тренировок на серверах (пусть хоть полчасика в день) - тоже. Седьмое. Как только поймёте, что дошли до точки насыщения и дальнейший рост в олимпиадах приводит только к развитию навыков скорости и соревнования, а классические основы всех алгоритмов вам уже известны, валите оттуда как можно скорее. Потому что с этого момента начинается ваша деградация как человека практического. Сразу переключайтесь на реальную работу, изучайте стандарты программирования, которые не смогли изучить в бытность олимпиадником и беритесь за реальные задачи. Если вы проигнорировали совет делать это параллельно, то придётся несколько лет переучиваться. Восьмое. Игры затягивают в себя своим соревновательным духом, олимпиады насыщают гордыню и подсаживают на чувстве значимости и особенности. Помните, что это иллюзия, увод в сторону. Это хорошая школа для того чтобы научиться чувствовать код и компьютер, изучить алгоритмы, но всё остальное (призы, места, победы и поражения, взгляды юных девушек) - это туфта. Не ведитесь на неё, потом будет обидно. Всё, желаю удачи, и да прибудет с вами здравый смысл :)

Ответ 2



Спортивная олимпиада поможет стать спортсменом. Математическая олимпиада поможет стать математиком. Олимпиадное программирование - не поможет стать программистом. Хобби - да. Как заменитель книг/игр - да. Как зарядка для ума - да. Как обучение программированию - нет. Слишком разные подходы к коду. Слишком разные цели у олимпиады и production. Поэтому, если хотите развиваться, советую участвовать в открытых проектах на github, gitlab, bitbucket, sourceforge и так далее. Таким образом вы и сообществу поможете, и получите опыт работы в команде, и получите опыт участия в реальных проектах. Да к тому же будет что показать работодателю если попросят примеры кода.

Ответ 3



Имхо Если Вы пишиете, и хотите продолжать писать на плюсах, то лучшее, что я могу Вам посоветовать, и что максимально поспособствует Вашему развитию (сугубо мое мнение), это написание игр. Начиная с легких консольных игр в которых будет присутствовать какая-то игровая логика, и двигаясь в сторону того, чтобы начинать изучать графические библиотеки, которые смогут помочь Вам постепенно лучше понять, как можно работать не только с консольными приложениями под винду, линукс и пр., а и приложения, на которые лично Вам станет приятнее смотреть. Как вариант, начните со змейки, крестиков ноликов, тенис и т.д. Лично я начинал с SFML, но вариантов также достаточно много, гугл поможет выбрать Ваш. В процессе, вероятнее всего, станет интереснее как написать более правильно, то что Вы делаете и тогда можно будет копнуть глубже в паттерны. Книг много и каждому больше подходит свое. Вместе с этим можно поднатаскать и навыки алгоритмов, но не стоит пытаться выучить каждый, т.к. профита от этого мало и большая часть либо выучится на практике, пока Вы будете искать хорошее решение своей проблемы, либо же вовсе Вам не понадобится, в силу того, что использовать приходится в большинстве случаев именно готовые решения. Главное - не стоит сильно закапываться в эти темы без практики, т.к. сырая теория в программировании дает невероятно маленький выхлоп, при этом без практики забывается все это очень быстро. Курсы Выбор на рынке крайне большой, но в целом, можете посмотреть бесплатные лекции на той же Курсере курс от Яндекса, есть чему научится. Полезным и интересным мне показался курс про многопоточность/сокеты на Степике, опять таки бесплатный и с достаточном хорошим уровнем задач где-то после 20-30% курса. Полезно Если Вы в универе на 1 курсе, то навык, который в какой-то степени уже можно начать развивать, и который будет крайне полезен для Вас, как для программиста всегда - чтение чужого кода. Элементарно можете начать с помощи одногруппникам с его лабой, которая почему-то не работает. Пытаясь понять его код (если он не будет у всех копипастой) Вы будете понемногу, но учится работать с чужим кодом. Т.к. в этой професии работать с чужим кодом зачастую приходится ооочень часто, то такой навык будет очень сильно упрощать Вашу первую и последущие. А еще, никогда не ленитесь дебажить, если что-то не работает, и сразу непонятно, что именно сломалось, в первую очередь попытайтесь изучить (если еще не изучили), а после применить свои скиллы дебагинга и найти корень зла в Вашей программе. П.С. Слегка сумбурно, скорее всего еще подкорректирую и дополню, но в целом, желаю успеха в Ваших начинаниях.

Ответ 4



Вопрос был задан про развитие в олимпиадном программировании, а ответы про то, насколько это бесполезно и т.д... Отвечу по теме. Во-первых надо смотреть по уровню. Лично я с командой в начале тренировался на этом сайте: https://acmp.ru/. Там много простых задач, и можно потихоньку увеличивать сложность. Некоторых задач можно найти разборы на ютубе и в интернете. Так же изучайте алгоритмы! На том же сайте есть тренировки алгоритмов, и хороший сайт с алгоритмами: http://e-maxx.ru/algo/. Там есть и графы, и со строками, и на комбинаторику, и всё, что душа пожелает. А участвовать можно на соревнованиях тут: https://codeforces.com/problemset . Тут самые похожие задачи с теми, что на олимпиаде. По началу можете в архивах находить те, что с самой простой сложностью. Когда повысите уровень, можете пробывать участвовать в соревнованиях. И вообще, олимпиадное программирование мало похоже на профессиональное, но оно даст вам хорошую базу, и знание алгоритмов. И когда мы ездим на олимпиады, всегда есть возможность завести новые знакомства, и куча it компаний предлагают работу у себя. Так что это точно опыт, который не помешает. Так что не слушай некого, и занимайся тем, что нравится))

Ответ 5



Мой любимий сайт с задачами по программированию, очень хорошо можно прокачать свой уровень и главное увидеть прогресс. Решая регулярно эти задачи можно подготовится к олимпиаде и не только, очень многое вам пригодится в учебе и в будущей работе. https://www.codewars.com/ Еще классний момент, сайт исходя из вашей инфы найдет других пользователей, которые учаться с вами в одном универе. Можно найти новых друзей. Удачи!