Блог пользователя VC15

Автор VC15, 13 лет назад, По-русски

C++0x наконец-то вышел. Кто-то безгранично рад этому и уже по полной использует его новые возможности, кому-то все равно, ну а кто-то не видит в этом ничего хорошего. Что касается меня, то я отношусь к нему с осторожностью, изучая его и пытаясь найти рациональное применение новым особенностям языка.

Вчера я смотрел доклад Герба Саттера на конференции Going Native 2012, где он рассказывал о С++11 и о том, как он меняет способ использования С++. Рассказывая о ключевом слове auto, Герб призвал использовать его по умолчанию, явно указывая тип только когда это необходимо. Бесспорно, использование auto сильно упрощает набор олимпиадного кода. Например,

map<string, pair<int, int> > m;
auto i = m.find("a");

писать гораздо проще, чем "по-старому".

Однако в больших проектах, как мне кажется, ситуация иная. В таких программах огромное значение имеет читабельность кода, простота его восприятия, а не сокращение времени его набора. Рассмотрим пример.

auto x = foo(Widget());
x.bar();

Что можно сказать, взглянув на этот код? Очевидно, функция foo() возвращает объект некоторого класса, у которого потом вызывается метод bar(). Для дальнейшего использования объекта x мы должны знать его класс, чтобы обращаться к его интерфейсу. Как узнать этот класс?

Ответ напрашивается сам собой — посмотреть объявление функции foo(). Любая современная IDE подскажет вам тип возвращаемого ею значения, вам даже не придётся искать её в проекте. Однако это требует выполнения дополнительного действия, в котором не было бы необходимости при явном указании типа. К тому же, стоит отметь, что возникает зависимость от IDE, с бумажки такой код читать будет тяжелее. Пусть это и не столь критично, но всё-таки...

А ведь ситуация может оказаться ещё веселее. Рассмотрим вот такой код:

auto foo(Widget w) -> decltype(w.prop())
{
	return w.prop();
}

Что мы здесь видим? Тип функции foo() нигде явно не определён, необходимо узнать, что возвращает метод prop() класса Widget. А это требует дальнейшего исследования кода. В результате мы можем уйти глубоко в дебри нашего проекта, только чтобы узнать, какой тип имеет переменная x. Конечно, приведённые примеры искусственные, но мне кажется, нечто подобное запросто может появиться и в реальном коде.

Резюме. Этой статьёй я не хочу сказать, что C++11 — это плохо, и его использование не принесёт ничего кроме дополнительной головной боли. Я только хочу сказать, что использовать его возможности надо умеренно и только там, где они действительно упрощают создание и понимание кода. auto, на мой взгляд, — это очень полезная возможность C++11, однако его чрезмерное употребление может существенно усложнить понимание написанного кода. Поэтому я не согласен с Саттером и считаю, что использование auto по умолчанию — не очень хорошая идея.

Полный текст и комментарии »

  • Проголосовать: нравится
  • +53
  • Проголосовать: не нравится

Автор VC15, 13 лет назад, перевод, По-русски

There is a very interesting contradiction between productivity of modern hardware and speed of modern software. My first PC had 700 MHz CPU, 64 MB RAM and Windows 98. It took 2-3 minutes to start the operating system. The laptop I'm writing this post on has a dual-core 2 MHz CPU, 2 GB RAM and Windows 7. And it takes the same 2-3 minutes to start up.
The other exmaple. I use Opera. It fits me well except one thing — its launching time. I can't imagine what a browser should do to start in about 20 seconds. But it does. Chrome is supposed to be the fastest browser but it also doesn't show its window immediately after launching. Hey guys, it's just a browser! It must start as fast as Windows notepad does! It should just open its window which usually doesn't have some complex GUI at startup. Maybe additionally it can load a bunch of favourite links but that's all. It just can't take so much time...
So the question is why doesn't the software become faster despite such a significant growth of hardware capabilities in last 10 years? 
I think there are two reasons of this situation:
1. More powerful hardware set weaker requirements on programs.
2. Software development process usually should fit schedule and budget.
So you won't use char instead of int to store tiny numbers (of course if memory isn't a bottleneck). You won't cache linear search results because you have just hundred of items in a list. You will use Python instead of C because it's much easier to write programs with it.
So why do programmers do that? Because it takes less time and doesn't reasonbly hit productivity. To create more effective algorithm you gonna take more time and be paid more. But nobody needs the best effectiveness, satisfactory effectiveness is enough. Browsers and operating systems take much time to start because people load them once a day and don't shut down. If you deviate from this common pattern ... nobody cares :)

Полный текст и комментарии »

  • Проголосовать: нравится
  • +30
  • Проголосовать: не нравится

Автор VC15, 13 лет назад, По-русски

Наконец-то я поучаствовал в Codeforces Round, проводимом по оригинальным правилам! 

В целом мне кажется такой вариант проведения соревнований очень интересным. По сравнению с TopCoder здесь нужно тщательнее продумывать свою тактику, так как фазы решения задач и взлома не разделены. К тому же, на мой взгляд, такие правила дают больше возможностей проявить себя. Например, участник, который на отдельно взятом контесте не может решить больше 2-3 задач, может компенсировать дефицит баллов большим количеством взломов, если он умеет хорошо читать чужой и нашёл какой-то особый случай, который многие могли не учесть.
К сожалению, я осилил только две первые задачи (а может, и меньше - я пишу это во время сис. теста) и, отчаявшись, последние полчаса контеста провёл, читая решения других участников. За этим занятием я наткнулся на особенность данного сайта, которая меня привела просто в ярость. Это закрытие просматриваемого решения по тайм-ауту. Мне очень интересно, зачем организаторы это сделали.
Как пользователь я это вижу вот так:
  1. Я в таблице нахожу какое-то решение, которое хочу попытаться взломать.
  2. Открываю его и вижу перед собой приблизительно следующее:

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

Казалось бы, ничего страшного. Вот только, провозившись немалое время с кодом, я, естественно, уже напрочь забыл кому он принадлежит, я не помню ник пользователя, чьё решение я открыл. Посмотрите внимательно на скриншот, на нём нет информации о том, чей код сейчас отображается! В результате мне приходится заново искать это решение, на что может уйти немало времени.
Я абсолютно уверен, что я далеко не первый, кто сталкивается с такой проблемой. И мне очень интересно, почему система работает так, как она работает.
Кроме того, к сожалению, у меня как в Opera, так и в Chrome не работал скроллинг кода при просмотре - вместо кода прокручивалась таблица текущих результатов. Таскать мышкой полосу прокрутки очень неудобно. При этом в Opera происходит выделение элементов таблицы результатов.

P.S. Забавно получается, что я опять ругаюсь на пользовательский интерфейс Codeforces. Честное слово, я не со зла, а только в целях его улучшения.

Полный текст и комментарии »

  • Проголосовать: нравится
  • +5
  • Проголосовать: не нравится

Автор VC15, 13 лет назад, По-русски

В коем-то веке выдалось на работе свободное время, и решил я написать на codeforces статью на интересную, на мой взгляд, тему. Я потратил на неё 3 часа. Я тщательно подбирал слова, аккуратно формулировал мысли, чтобы сделать статью интересной и доходчивой. Короче говоря, я вложил в неё немало сил. А главное, я чуть ли не после каждого предложения нажимал "Сохранить в черновиках".

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

Придя домой, я не обнаружил статью в "Прямом эфире". Более того, её не было в списке статей моего блога. Короче говоря, никаких следов своей статьи я не нашёл.

Я начал экспериментировать с созданием новой записи в блоге и понял, что ни публикация, НИ СОХРАНЕНИЕ В ЧЕРНОВИК не выполняются, если к статье не добавить ни одного тега!!!! Вы понимаете?! 3 часа работы коту под хвост, потому что я не добавил к статье теги!!!! 

Я очень надеюсь, что это баг этого сайта. Потому что если это сделано намеренно, это в высшей степени глупо! Ладно, не давайте публиковать статью без тегов. Но сохранение в черновик! В очередной раз убеждаюсь, что нельзя писать текст в этих веб-мордах, надо пользоваться простым текстовым редактором и сохранять на диск. Но как я мог подумать, что здесь, на codeforces, всё сделано так, как сделано. 

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

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

Полный текст и комментарии »

  • Проголосовать: нравится
  • 0
  • Проголосовать: не нравится

Автор VC15, 15 лет назад, По-русски

Когда на ACM ICPC отменили Pascal, мы всей командой перешли на С++ и в течение последних двух лет олимпиадной "карьеры" писали именно на нём. За это время мы неплохо освоили STL.

Кроме того, сейчас на работе я также пишу на С++ (а также использую Qt). Так что могу сказать, что с С++ я знаком неплохо.

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

Но чего я не знаю, так это основных классов Java SE. Вот у меня и возникла следующая идея. Неплохо было бы, если б кто-то из тех, кто в олимпиадах активно использует/использовал Java, описал "джентельменский" набор классов и их основных методов, которые регулярно приходится применять на контестах. Это будет полезно не только мне, но и всем, кто собирается переходить с, например, Pascal на Java.

Полный текст и комментарии »

  • Проголосовать: нравится
  • +16
  • Проголосовать: не нравится

Автор VC15, 15 лет назад, По-русски

Пост пользователя SkidanovAlex и комментарии к нему натолкнули меня на мысль задать более конкретный вопрос тем, кто уже ушёл на олимпиадную "пенсию".

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

Просто мне очень интересно, кто как устраивается после занятий спортивным программированием и насколько качество работы соответствует былым заслугам на контестах.

Полный текст и комментарии »

  • Проголосовать: нравится
  • +2
  • Проголосовать: не нравится