7 сентября 2016 в 10:21

Плохой код убивает из песочницы

Плохой программист Джон сделал ошибку в коде, из-за которой каждый пользователь программы был вынужден потратить в среднем 15 минут времени на поиск обхода возникшей проблемы. Пользователей было 10 миллионов. Всего впустую потрачено 150 миллионов минут = 2.5 миллиона часов. Если человек спит 8 часов в сутки, то на сознательную деятельность у него остается 16 часов. То есть Джон уничтожил 156250 человеко-дней ≈ 427.8 человеко-лет. Средний мужчина живет 64 года, значит Джон убил примерно 6 целых 68 сотых человека.

Как тебе спится, Джон — серийный программист?

Пользователи — низ пищевой цепочки. Программисты также медленно убивают друг друга.

Правила хорошего кода


Простота-понятность-компактность, производительность, отсутствие дублирования.

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

Примечание: «hello world” — не ошибка, именно так поставил кавычки LibreOffice Writer. Джонни, привет! Всегда рад тебе! Шучу, никогда.

Как выбрать хорошее имя


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

Джон_плохой_программист — хорошее имя. Хорошее имя состоит из одного, двух или трех слов. Три — много. Одно — хорошо, но часто не хватает чтобы отразить суть. Прочитайте следующие имена файлов (классов), можете ли вы угадать назначение кода, не заглядывая внутрь?

profiler.h
jitter_measurement.h
developer_menu.h
Animation2D.h
Rectangle.h
Wind_effect.h

Имя объекта внутри файла совпадает с названием файла. Путаница не нужна.

Если после моего объяснения вы продолжите давать файлам непонятные имена вроде SoMFVec2s.h, то застрелитесь. Это рациональный поступок, ведь тем самым программист спасает несколько чужих жизней.

Замечание: ограничение на имена файлов 8.3 снято более 20 лет назад.

Нужны ли именам префиксы?


НЕТ.

Визуальный шум не нужен.

Современные «текстовые редакторы для программистов» выдадут вам информацию о прототипе чего угодно по нажатию одной кнопки или наведению курсора мышки. Поэтому любые префиксы в 20NN году совершенно излишни.

То же самое можно сказать о пространствах имен — пространство имен — это префикс. Постоянно используя префиксы типа std:: cv:: вы конечно гарантируете себя от ошибки случайного использования объекта из другого пространства имен. НО!

Вы хоть раз так ошибались?
Приводила ли ошибка к чему-то серьезному?
А набивать лишние символы приходится сотни и сотни раз.
Оцените издержки. Это ваша единственная жизнь, между прочим.
Потратил 100 часов жизни на набивание префиксов? Ты нормальный? Лучше бы погулял сходил… Мама

Можно ли давать объектам короткие имена


НУЖНО.

int i;
char c;
byte b;
string s;
vector v;
pointer p;
argument a1;

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

Подпространство


В окне «Панель управления windows», вы видите объекты «Установка обновлений windows», «Сервисы windows» и «Шрифты windows». Несомненно вас считают за идиота, который забыл где находится. А также за человека, который любит нагружать свой мозг: раз за разом искать нужный объект, отфильтровывая визуальный шум.

В подпространстве находится 52 объекта, не разделенных на группы ни по какому признаку. Костыля: «быстрый поиск по паре букв с клавиатуры» также нет. Наслаждайся.

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

Комментарии


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

Кстати...


…. а давайте создадим вместе с нашей программой сотню других, совершенно бесполезных, которыми никто не будет пользоваться. И будем заставлять пользователя устанавливать на диск их все. Не дадим ему выбора. А свою основную работу выполним кое как — тяп ляп и готово. И так сойдет! Хахаха!

Какая сложная, объемная, нестабильная и склонная к саморазрушению у нас получилась система! Потрясающе!

А еще давайте при установке одного из обновлений потреблять 6 гигабайт памяти, чтобы на ноутбуке с отключенным файлом подкачки повылетали пользовательские приложения. Ведь нам нужны все 6 гигабайт! Эй, сходи докупи памяти! А еще они будут устанавливаться медленно даже на самых современных компьютерах!

А давайте создадим в нашей операционной системе кучу сетевых сервисов, которыми никто не будет пользоваться. Но мы все их включим по умолчанию. В наших сервисах будет множество уязвимостей, желательно уровня remote code execution и мы будем постоянно их исправлять! Кайф! А еще наш установщик обновлений будет зависать потребляя гигабайт памяти и 100% ресурсов процессора.

И мы будем делать ошибки. Пусть например наше обновление KB3136000 будет устанавливаться много раз.

Джон, ты гений!

Сложно!


На поиск этой функции я потратил минут 20. Простая задача: разбить строку по разделителям. Простая задача должна решаться максимально просто:

void split(const string& s, std::vector<string>& result, const string& delimiters = " ")
{
	string::size_type a = s.find_first_not_of(delimiters, 0);
	string::size_type b = s.find_first_of(delimiters, a);

	while (string::npos != b || string::npos != a)
	{
		result.push_back(s.substr(a, b - a));

		a = s.find_first_not_of(delimiters, b);
		b = s.find_first_of(delimiters, a);
	}
}

А затем я упростил эту функцию, без ущерба ликвидировав дублирование:

void split(const string& s, std::vector<string>& result, const string& delimiters = " ")
{
	string::size_type a, b = 0;

	for(;;)
	{	a = s.find_first_not_of(delimiters, b);
		b = s.find_first_of(delimiters, a);

		if (string::npos == b && string::npos == a) break;

		result.push_back(s.substr(a, b - a));
	}
}

Если вы можете решить задачу проще — сделайте это и я сочиню небольшую хвалебную оду в вашу честь. В интернете множество людей предлагают использовать для разбиения строки: boost, регулярные выражения, черта из ада, космический корабль пришельцев… Возьми в проект огромный boost, занимающий несколько гигабайт места на SSD диске, вместо маленькой функции… «Ну ведь оно потом ищо для чего-нибудь пригодится...»

Дорогой друг, мне всего навсего разбить строку! Буст? Это как если бы тебе нужно было пришить пуговицу, а люди предлагают здоровенный портняжный китайский агрегат в несколько тонн весом. Он умеет пришивать пуговицы. И несомненно еще для чего-нибудь пригодиться. Например, он сможет подшить тебе твой правый ботинок через полгода, когда тот порвется. Но издержки…

Кто виноват, что Джонни не позаботился о наличии в могучем языке C++ стандартного способа выполнить стандартное действие? Джон, скольких программистов ты уже убил?

О скорости кода


Джонни, который создает «профилировщики производительности» в средах программирования — ты самый отвратительный убийца. Твой код не делает ничего полезного уже много лет. Люди же тратят мегачасы времени, пытаясь выдоить из твоей животинки хоть немного смысла, дергая ее за разные места…

В конструкции вроде этой, больше красоты и мощи, чем во всех твоих творениях:

unsigned long t0 = current_time();
// какой-то код

cout << current_time() - t0 << endl;

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

profiler.h
/*
Profiler prof;

for (;;)
{
	Sleep(50); // code, which does not need to measure performance

	prof(NULL);

	Sleep(100); // some code

	prof("code1");

	Sleep(200); // some code

	prof("code2");

	prof.periodic_dump(5);
		// every 5 seconds will print table
}
*/

#include <stdint.h>
#include <stdio.h>

#include <string>
using std::string;

#include <set>
using std::set;

#include <algorithm>
using std::min;
using std::max;

#ifdef WIN32
#include <Windows.h>

class Microseconds
{
public:
	uint64_t operator()()
	{
		LARGE_INTEGER now;
		QueryPerformanceCounter(&now);
		LARGE_INTEGER freq;
		QueryPerformanceFrequency(&freq);

		return now.QuadPart * 1000 / (freq.QuadPart / 1000);
			// overflow occurs much later
	}
};

#else
#include <sys/time.h>
//#include "android_workarround.h"
class Microseconds
{
public:
	uint64_t operator()()
	{
		timeval tv;
		gettimeofday(&tv, NULL);
		return (uint64_t)tv.tv_sec * 1000000 + tv.tv_usec;
	}
};
#endif

class Profiler
{
	Microseconds microseconds;

	class Event
	{
		public:
		const char* name;
		uint64_t time;
		uint64_t count;
		uint64_t min_time;
		uint64_t max_time;

		void reset()
		{
			time = 0;
			count = 0;
			min_time = (uint64_t)-1;
			max_time = 0;
		}
	};

	class Comparator
	{
		public:
		bool operator()(const Event& a, const Event& b) const
		{	//return strcmp(a.name, b.name) < 0;
			return (void*)a.name < (void*)b.name;
		}
	};

	set<Event, Comparator> events;

	uint64_t t0;
	uint64_t last_dump;

	Event c;
	set<Event>::iterator i;

public:
	Profiler()
	{
		last_dump = t0 = microseconds();
	}

	void operator()(const char* what)
	{
		if (what == NULL)
		{
			t0 = microseconds();
			return;
		}

		uint64_t t = microseconds() - t0;

		c.name = what;
		i = events.find(c);

		if (i == events.end())
		{
			c.reset();
			i = events.insert(c).first;
		}

		Event& e = const_cast<Event&>(*i);

		e.time += t;
		e.min_time = min(e.min_time, t);
		e.max_time = max(e.max_time, t);
		++e.count;

		t0 = microseconds();
	}

	void dump()
	{
		const float MS = 0.001f;

		float f_summ = 0;
		for (i = events.begin(); i != events.end(); ++i)
			f_summ += (float)i->time;

		if (f_summ == 0) return;

		f_summ *= MS;
		f_summ *= .01f; // %

		printf("           name count   total(%%)        min   avg   max\n");

		for (i = events.begin(); i != events.end(); ++i)
		{
			Event& e = const_cast<Event&>(*i);

			if (e.count == 0) e.min_time = 0;

			float f_time = e.time * MS;
			float f_min = e.min_time * MS;
			float f_max = e.max_time * MS;
			float f_average = e.count == 0 ? 0 : f_time / (float)e.count;

			printf("%15s %5llu %7.1f(%5.1f%%) %5.1f %5.1f %5.1f\n",
				e.name, (long long unsigned int)e.count,
				f_time, f_time / f_summ, f_min, f_average, f_max);

			e.reset();
		}
	}

	void periodic_dump(unsigned int period)
	{
		if (microseconds() < last_dump + period * 1000000) return;
		dump();
		last_dump = microseconds();
	}
};

В консоли вывод выглядит так, все время в миллисекундах:

           name count   total(%)        min   avg   max 
       detector     0     0.0(  0.0%)   0.0   0.0   0.0 
      predictor   161   287.8( 46.1%)   1.0   1.8   2.3 
        refiner   161   246.9( 39.5%)   0.8   1.5   1.8 
      shape fit   161    90.0( 14.4%)   0.3   0.6   0.8 

Обратите внимание, вверху в комментарии к исходному коду дан работающий пример.

Если вдруг нужно вывести таблицу на экран, то dump модифицируется так, чтобы записывать свой вывод в vector out; Далее графическая часть отрисовывает текст моноширинным шрифтом. Вывод профайлера у вас на экране. Оценить скорость старой и новой функции одновременно, в живом приложении? Пожалуйста. Только не забывайте про кэши процессора.

Предложения по упрощению-улучшению профилировщика принимаются. Простая задача — простое решение. Джонни, сделай мне приложение на 500 гигабайт, делающее то же самое, но хуже.

Что такое установка программы


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

Ваша программа настолько плоха, что в работе ее приходится переинициализировать несколькими разными способами. Сломалось? Перезагрузи. Все равно не работает? Переустанови. Убийство времени пользователя — убийство пользователя.

Ты выложил код в интернет


Ты сделал это, молодец! Ты поделился продуктами желудочков твоего мозга с человечеством. Скольких ты убил? Сколько программистов умерло, пытаясь понять что делает этот файл? Сколько судеб ты стер из реальности, не проверив собирается ли твое творение на двух популярных операционных системах? Может стоило вместо длиннющего копирайта «Юниверситет им. Василия Пупкина, все права защищены», вставить хотя бы одну строку с описанием что же делает этот модуль? Ах код сложно было писать, пусть они помучаются… ну-ну… Корея. Гав.

Дорогой студент — не пиши код.
Если пишешь — не сохраняй.
Если сохраняешь — не выкладывай.
Если выложил — не в интернет.
Если в интернет — удали.
Если удалил — сделал добро людям.

Послесловие


Вышло новое бесполезное обновление windows, время установки 15 минут. Погибло 5048 человек…

Исправленный по критике хабровчан profiler.h

profiler.h
/*

#ifdef linux
#include <time.h>
void Sleep(int milliseconds)
{
	struct timespec ts;
	ts.tv_sec = milliseconds / 1000;
	ts.tv_nsec = (milliseconds % 1000) * 1000000;
	nanosleep(&ts, NULL);
}
#endif

int main()
{	Profiler prof;

	for(;;)
	{	
		Sleep(50); // code, which does not need to measure performance

		prof(NULL);

		Sleep(100); // some code

		prof("code1");

		Sleep(200); // some code

		prof("code2");

		prof.periodic_dump(5);
			// every 5 seconds will print table
	}
	return 0;
}
*/

#include <stdint.h>
#include <stdio.h>

#include <vector>
using std::vector;

#include <string>
using std::string;

#include <map>
using std::map;

#include <algorithm>
using std::min;
using std::max;

#include <utility>
using std::make_pair;

#include <iostream>
using std::cout;

#ifdef linux

#include <sys/time.h>

static uint64_t microseconds()
{	timeval tv;
	gettimeofday(&tv, NULL);
	return (uint64_t)tv.tv_sec * 1000000 + tv.tv_usec;
}

#else

#include <Windows.h>

static uint64_t microseconds()
{
	LARGE_INTEGER now;
	QueryPerformanceCounter(&now);
	LARGE_INTEGER freq;
	QueryPerformanceFrequency(&freq);
	return now.QuadPart * 1000 / (freq.QuadPart / 1000);
		// overflow occurs much later
}

#endif

class Profiler
{	
	class Event
	{
	public:
		uint64_t time;
		uint64_t count;
		uint64_t min_time;
		uint64_t max_time;

		void reset()
		{	time = 0;
			count = 0;
			min_time = (uint64_t)-1;
			max_time = 0;
		}
	};

	map<const char*, Event> events;

	uint64_t t0;
	uint64_t last_dump;

	map<const char*, Event>::iterator i;

public:
	vector<string> out;

	Profiler()
	{	last_dump = t0 = microseconds();
	}

	void operator()(const char* what)
	{	
		if (what == NULL)
		{
			t0 = microseconds();
			return;
		}
		
		uint64_t t = microseconds() - t0;

		i = events.find(what);
		
		if(i == events.end())
		{	
			Event e;
			e.reset();
			i = events.insert(make_pair(what, e)).first;
		}

		Event& e = (*i).second;

		e.time += t;
		e.min_time = min(e.min_time, t);
		e.max_time = max(e.max_time, t);
		++e.count;

		t0 = microseconds();
	}

	void dump()
	{
		out.clear();

		const float us_to_ms = 0.001f;
		
		float summ = 0;
		for (i = events.begin(); i != events.end(); ++i)
		{	
			Event& e = (*i).second;

			summ += (float)e.time;
		}

		if (summ == 0) return;

		summ *= us_to_ms;

		out.push_back("           name count   total(%)        min   avg   max\n");

		for(i = events.begin(); i != events.end(); ++i)
		{
			Event& e = (*i).second;

			if(e.count == 0) e.min_time = 0;

			float time = e.time * us_to_ms;
			float min_time = e.min_time * us_to_ms;
			float max_time = e.max_time * us_to_ms;
			float average = e.count == 0 ? 0 : time / (float)e.count;

			char tmp[0x100];

			snprintf(tmp, sizeof(tmp), "%15s %5llu %7.1f(%5.1f%%) %5.1f %5.1f %5.1f\n",
				i->first, (long long unsigned int)e.count,
				time, time / summ * 100, min_time, average, max_time);
			out.push_back(tmp);
			
			e.reset();
		}

		for (int i = 0; i < out.size(); ++i) cout << out[i];
	}

	void periodic_dump(unsigned int period)
	{	if(microseconds() < last_dump + period * 1000000) return;
		dump();
		last_dump = microseconds();
	}
};
@s_o_v_a
карма
–20,0
рейтинг 0,0
Самое читаемое Разработка

Комментарии (258)

  • +30
    Нехило кто-то горит. Видать, пишет идеальный код?
  • +3
    То же самое можно сказать о пространствах имен — пространство имен — это префикс. Постоянно используя префиксы типа std:: cv:: вы конечно гарантируете себя от ошибки

    Увы, тут только долгожданные модули могли бы помочь, ибо писать using'и в каждой короткой функции (а больше писать их негде) ещё хуже.

    • +3
      Признание программиста что, он криворук и делает допущения о состоянии системы при старте своей программы.

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

      • –6
        Программа может сама исправить ошибку. Даже если нет компонента системы, который ты не можешь интегрировать в свой модуль (например directx) Что тебе стоит выдать сообщение пользователю «у вас не найден директикс, открыть страницу майкрософт с которой его можно скачать?»
        Лучше будет если ты его сам скачаешь и установишь, спросив у пользователя разрешение на это. Но зная криворукость кодеров и тупорылость админов сайтов, которые запросто могут переложить контент куда угодно просто потому что зачесалась левая пятка у менеджера…
        • +5

          Может исправить. А может не исправлять. Причём нельзя сказать, что первое лучше второго всегда: надо смотреть по ситуации, и даже в каждой конкретной ситуации отимальное решение этого вопроса обычно неочевидно. Также программа может требовать инсталляции, а может не требовать. Но главное, что если программа не работает без установки, это ни в коем случае не "признание программиста что, он криворук и делает допущения о состоянии системы при старте своей программы". И профессионал бы такой чуши никогда не написал.

          • –6
            Ну извини, 5 лет в геймдеве, сейчас по компьютерному зрению — не профессионал.
            Ты статью просто не понял, суть. Ее надо целиком воспринимать: инсталляция забирает время у пользователя. Значит ее не должно быть.
            • +5
              Ну извини, 5 лет в геймдеве, сейчас по компьютерному зрению — не профессионал.

              Бывает и умные говорят глупости.


              инсталляция забирает время у пользователя. Значит ее не должно быть.

              Это интересная и, безусловно, имеющая право на жизнь и отстаивание точка зрения, но я с этим не спорил.

            • 0
              на Mac OS X ее практически и нет ни у кого.
              — открыть .dmg-архив (у эстетов — .zip, некоторые другие эстеты на открытие .dmg обычным способом подвешивают показ EULA с кнопками но редко)
              — перетащить приложение в папку Applications (обычно в архиве сразу ярлычок). Некоторые приложения сами предлагают себя переместить если не правильно расположен
              — запустить. если приложение подписано Developer ID (затраты разработчика — 99 USD в год и немного времени при сборке) то все запустится. Иначе надо ПКМ+Открыть первой раз и пользователя спросят а точно ли он хочет запустить то что скачано из интернета. Ну или можно отключить gatekeeper
              то что названо выше «приложением» — на самом деле App Bundle (отображаемый в Finder как файл но реально это каталог в котором содержится все необходимое для работы приложения). Один из недостатков — не-системные библиотеки дублируются в каждом приложении которое их использует. Если надо обновления то либо ручками просить пользователя скачать либо встраивать библиотеку для обновлений вроде Sparkle либо… идти в Mac App Store (если оно нас устраивает)

              Есть редкие приложения которые ставятся не так но из того что встречалось это например:
              — Все подряд виртуальные машины (видимо потому что ставить драйвера)
              — MS Office (видимо потому что MS считает себя особо умными), LibreOffice вполне ставится по той схеме с копированием что выше.
              — Драйвер сканера старый — эти вообще требовали все закрыть и перезагрузить машину

              после установки приложение может попросить установить некоторые компоненты если реально надо (iStat Menus например)

              если использовать Mac App Store то разумеется — нажать одну кнопку но там далеко не все приложения вообще могут быть.

              Установка обновления системы, включая мажорные — жмем установить, идем пить кофе, в некоторых случаях — много кофе. иногда после переустановки вводим заново Apple ID. Разумеется ОДИН раз идем пить кофе

              Linux'ы:
              почти всегда — apt-get install /yum install и идем пить кофе. в некоторых редких случаях потом отвечаем на вопросы. Да, установка. почти полностью автоматическая.
              вот если пакета нет в репозитории дистрибутива то начинаются танцы с бубнами. ну и консоль.

              сейчас разрабатывается система 'snap-пакетов' — которая по сути позволяет реализовать схему Mac OS X с просто перетаскиванием. При этом приложение будет еще и работать на любом дистрибутиве что это поддерживает (вот с точки зрения разработчика пакетов… не все так просто).

              • 0
                Система, которую делали «для людей».
                Но в итоге компьютеры с этой системой стали элитными, а не массовыми.
              • +1
                Что не так с MS Office? Последняя версия представляет из себя точно такой же App Bundle. То, что родной установщик безальтернативно устанавливает полный набор софта из pkg — конечно, не очень приятно. Кстати, VMWare Fusion тоже нормально живёт как App Bundle.
  • +12
    Можно ли давать объектам короткие имена?
    • можно ТОЛЬКО в рамках словаря допустимых сокращений. Иногда любителей имен вида "a", "c", "o" — хочется придушить.

    • +15
      на самом деле есть простое правило — чем короче область видимости переменной, тем короче можно делать ее имя
      • 0
        В ранних версиях языка Рефал имя переменной могло быть только из одной буквы. И вполне серьезные программы на нем писались…
        Правда область видимости переменной там редко превышает 2-3 строки.
        • 0
          Насколько я помню, переменных(в общепринятом смысле) в РЕФАЛе нет.
          • 0
            Как и в Hashell, Erlang и большенстве других фунциональных языков.
            Тем не менее, практически все называют их так. Может это неправильно и вызывает недопонимание при общении с нефункциональными программистами, но более удачного термина (простого и понятного) я не знаю.
  • +1
    На поиск этой функции я потратил минут 20. Простая задача: разбить строку по разделителям. Простая задача должна решаться максимально просто
    Пусть умирают неподготовленные http://www.cplusplus.com/reference/cstring/strtok/
    • 0
      дак strtok не решает проблемы. Все равно нужно писать обертку, которая раскидает части строки в вектор.
      К тому же, если я правильно понимаю её работу, она может сломаться при многопоточности.
      • 0
        Есть потокобезопасный strtok_r аналог.
    • +1
      Несколько раз слышал и читал, что, возможно, strtok — самая ужасная часть стандарта C, которую точно не стоит использовать, программируя на C++. Особенно работая с vector и string
  • +13
    А сколько людей умерло из-за того, что мы с вами прочитали эту статью? Как посчитать? И кто их убил: автор, переводчик, оба (и сколько в процентах вина каждого в таком случае)? :)
    • +3
      Не было никакого переводчика.
      И статья задумана скорее как средство предотвращения хотя бы малой части убийств.
      • +1

        Очень понравилось ваше вступление про Джона, перевел для коллег =)


        Перевод

        A bad programmer John made a mistake in the code, due to which every user of the program was forced to spend an average of 15 minutes to find a work around the problem. There were 10 million members. In total they wasted 150 million minutes = 2.5 million hours. If a person sleeps 8 hours a day, then 16 hours are left for the conscious activity. That is, John has destroyed 156,250 man-days ≈ 427.8 person-years. The average man lives 64 years, so John had killed as many as 6.68 people.


        Are you sleeping well, John — serial programmer?

        • 0
          Привычнее фраза «How do you sleep at night?»
  • +5
    Главная причина такого положения — избыток свободы в действиях программиста. Компиляторы позволяют программистам такое, что невольно задумаешься над аналогом «суда офицерской чести», но для кодеров.

    Нет в информационном мире сопромата. Нет гравитации. Только время ещё имеет значение. Но, как говорил один мой друг: «если мой код у тебя тормозит — просто купи себе новый процессор».

    Плюс, бизнес своими, кхм, странными требованиями, проводит такой дикий отрицательный отбор в индустрии, что даже эволюция уже не действует, выживает любой кадавр.
    • –5
      Я считаю что виновато неправильное «обезьянье» восприятие реальности. Человек подсознательно считает что больше — лучше. Больше объем, больше бесполезных модулей, больше время установки — ого, эта программа очень большая, над ней трудилась по крайней мере сотня человек. Они безусловно победят в кулачном бою ту горстку программистов, что написала такую же программу, но маленькую. Вот так думает обезьяна.
      В итоге мы имеем windows, который отжирает несколько ГИГАБАЙТ оперативной памяти при старте.
      Но посмотри внимательно на экран, что ты видишь? Должно ли это забирать гигабайт оперативной памяти? Для сравнение — буфер экрана, большой объект, займет порядка 10 мегабайт. Я вчера разжал по необходимости небольшое видео в память и оно заняло всего два гигабайта.
      • +12
        Но посмотри внимательно на экран, что ты видишь? Должно ли это забирать гигабайт оперативной памяти?

        Замечательно. Раз вы определяете потребность в памяти по тому, что видно на экране, то система, в принципе не работающая с экраном, по-вашему не должна занимать памяти вовсе.
      • +2
        Не знаю сколько одно должно занимать памяти, но Windows реально тормозит. На работе был компьютер с Windows 7, которая, даже свежеустановленная, работала так себе. Почтовик разворачивался потихоньку себя отрисовывая и т.д. Но вдруг у меня появилась возможность установить на этот же компьютер Linux. Это было просто преображение компьютера. Даже с эффектами Compiz компьютер работал просто очень шустро. Ну а почта… да, это был IBM Lotus, открывалась просто влёт. Фактически, для офисного применения скромный компьютер на Core2Duo с 2 гигабайтами оперативки оказывается может очень быстро работать. И, что самое хороше из подмеченного мной на домашнем компьютере, скорость работы системы под Linux не деградирует со временем, даже с учётом того, что почти никогда не делаю дефрагментацию. А на Windows дефрагментация немного помогает, но не позволяет достичь той же скорости работы, что была после установки системы.
        • 0
          Проблему выжирания памяти пытался узнать в https://geektimes.ru/post/279510/ (хотя в далёких бородатых это считалось нормой «не мешайте семёре работать»). Оказалось, что всякая телеметрия в лице щемящихся обновления со (сторонних) серверов упорно лезет даже при выключенном апдейте. Проблема решилась изменением политик файрвола. Тормоза могут остаться от PATA (IDE).
        • +1
          Странная история. Но вполне может быть, что тормозит не семерка, а драйвера под ваше железо. У меня есть такая проблема с ХР — тормоза с подключенным dual monitor. Берешь окошко, выносишь его на внешний монитор и все — приплыли, само приложение работает раз в 5 медленнее. Вносишь обратно — все ок. При этом с другими ноутами той же марки проблем нет.
        • +1
          «На работе был компютер» это не показатель тормознутости windows.
          Отрисовка окошек выполняется определенными схемами (directX, например), и если на компе на работе недоставили адекватные драйвера, то тормозить будет более чем. Зато если поставили, UI на Windows работает ГОРАЗДО быстрее UI на Линуксе.

          Люди, которые в 2016 году на Wшn7 ускоряют работу обычной рабочей станции дефрагментацией — IMHO очень плохо разбираются в настройках
          • 0
            Ну дома на ноутбуке родная Windows 8.1 была. Даже переустанавливал с форматированием винта (благо ключик зашит в BIOS). Сначала сносно работает, но после установки танков и стим начинает медленно деградировать. В это же время на этом же железе со второго винта Linux работает всегда с предсказуемой скоростью. Когда SSD поставил, совсем Linux реактивно стал. А вот Windows 10 так себе. Игры в Linux не смог проверить на скорость, т.к. симликн сделал на HDD для папки Steam. Но всё равно те же самые игры быстрее запускаются в Linux, но из-за драйверов бывает хуже работают.
      • 0
        У меня и линукс не меньше тормозил. Наименее тормозящей системой для меня оказался хакинтош. Может, *bsd тоже меньше тормозит, не проверял.
    • +1
      над аналогом «суда офицерской чести», но для кодеров.

      Это называется code review

  • +25
    Зачем я это прочитал?(2мин) s_o_v_a: Возможно вы убили уже пару человек, остановитесь!
  • +6
    Замечание, не относящееся к содержанию статьи: было бы неплохо вставки кода отформатировать для читабельности.
    • –1
      А они были отформатированы. Джонни с Хабра постарался…
    • –11
      Исправил. Не заметил сначала иконку карандаш в квадрате, означающую «редактировать». Например рядом иконка портфельчика, отличающаяся только яркостью чуть-чуть и она ничего не делает. Джонни сделал прекрасную замену всем понятного слова «редактировать» на красивую иконку, «чтобы не как у всех».

      Давно считаю Хабр отхожим местом :)
      • +3
        Если мне не изменяет память, то есть кнопка «Предпросмотр», при помощи которой можно проверить, что статья выглядит как надо.
        • +2
          В «предпросмотре» статья выглядела именно так как я ее и набрал — с правильными отступами везде. Я все проверил. Публикация же сожрала табуляцию в коде.
      • +9
        Не надо писать в отхожие места.
        Цените своё время.
  • +11
    Код самописного профайлера — восхитительный пример того, как его разработчик совершает геноциды.
    • –12
      Уями можно и столб покрыть, а толку. Покажи как надо, Джон.
  • +6
    А мне статья понравилась. Не понимаю, за что человека заминусовали, многие вещи как минимум заслуживают внимание, причем гораздо большего, нежели дискуссии на тему «табы vs пробелы».
    Вот с чем не согласен:
    01) Если давать короткие имена вида «а1», «а2», то потом очень сложно находить нужные места поиском.
    Например, часто требуется подкорректировать все места, где встречается какой-то определенный объект.
    02) Комментировать нужно. Но преимущественно те места, в которых у другого разработчика могут возникнуть трудности с пониманием, а что именно ты пытался сделать. Порой в чужом коде очень сложно понять, для чего именно тот или иной кусок кода.
    • +1
      > 01) Если давать короткие имена вида «а1», «а2», то потом очень сложно находить нужные места поиском.

      А никто и не говорил, что такое нужно применять в большом объёме кода, где ещё и искать надо будет. А вот в 20 строчном методе использование таких сокращий однозначно плюс.
    • +4
      Не понимаю, за что человека заминусовали

      Мне кажется, что человека заминусовали не за статью, а за его комментарии.
    • –3
      Не понимаю, за что человека заминусовали

      Потому что не такой как все. Несколько сотен лет назад его бы сожгли.
  • 0
    >Можно ли давать объектам короткие имена
    >НУЖНО.
    Рака яичек автору. Я посмотрю, сколько времени вы потратите на выяснение того, что такое e, c и чем они, блеать, отличаются.

    >неймспейсы
    >Приводила ли ошибка к чему-то серьезному?
    Очень плохой вопрос. Вот из-за таких «ракеты и падают». Не приводило, не приводило, но потом привело.
    Может вы еще из тех, кто пишет using namespace std;?

    >Код профайлера
    >f_time, f_min, f_max, f_average…
    Вы же нам, блеать, только что сами сказали, что префиксы — это мусор. И вообще, глядя на этот код хочется посоветовать автору отказаться от написания статей на хабр, а то не дай бог какие-нибудь неокрепшие умы воспримут вас всерьез…
    • +1
      «Я посмотрю, сколько времени вы потратите на выяснение того, что такое e, c и чем они, блеать, отличаются.»

      «В пределах области видимости пол-экрана — экран, короткое имя будет благом для всех.»

      Пару секунд? К тому же он, насколько я понял, говорит о стандартных переменных. Например об интовых итераторах (i, j, k), вспомогательных чарах и строках (c, ch, s).
      • +4
        Нет не пару секунд. За пару секунд вы в лучшем случае выясните тип переменной, но не ее семантику. Вот в примере профайлера обе переменные, c и e имеют тип Event. И что?
        Вот расскажите мне, для чего в его коде (profiler.h) нужна переменная c?
        Я потратил пару минут, чтобы сделать вывод о ней и авторе в результате.
        • 0
          Согласен, переменную c надо перенести на место ее использования. Тогда будет легче понять что c — сам event, а е — ссылка на event.

          Ругайте, материте мой код, тем самым вы только сделаете его лучше.
          • 0
            Слишком много, что можно исправить.
            Например, сюда бы лучше подошел std::map, а не std::set.
            for по итераторам лучше заменить на range-based for.
            f_summ у вас за время своей жизни претерпевает сразу несколько метаморфоз: сначала она содержит секунды, потом милисекунды, потом милисекунды-помноженные-на-коэффициент-чтобы-перевести-в-проценты-ненужная-ручная-оптимизация-которая-только-запутывает-читающего. Для каждой её семантики следовало бы завести свою const (кроме аккумулятора) переменную с понятным именем. А на одну сотую я бы ее вообще не множил. Потому что объяснить вы это кратко не сможете. Лучше домножить на сто в месте вывода.
            • –1
              range-based for отклоняется как бесполезная модификация.
              Выложил исправленный вариант.
              • +2
                >бесполезная модификация
                Ой, всё! Я вам больше ничего советовать не буду.
                • –1
                  Не ведь это библиотечный код, а c++11 не везде есть.
                  • +1
                    можно примеры, где его нет?
                    • 0
                      Какое-то устройство, где SDK не обновляется. Например, терминалы сбора данных CipherLab
                    • 0
                      Некоторые сертифицированные дистрибутивы, например, ОС МСВС. Можно пользоваться только встроенными средствами разработки, а там gcc 4.1.3
    • +1
      Замечание принято, действительно можно без префиксов.

      Рака вам взаимно.
  • +4
    Что-то в этом есть. Тому, кто придумал на этом экране сортировать элементы слева направо, а не сверху вниз, вполне можно посвятить:

    Скриншот панели управления

    • 0
      Зато там работает, как и везде в проводнике, быстрый поиск.
      Вводишь первые символы искомого элемента и он выделяется, осталось только нажать enter.
      • 0
        Проще всего забыть про существование Панели Управления, и пользоваться поиском в стартовом меню: «WinKey => [start typing]»
        • +1
          Это который может уйти искать в интернет, если я промахнусь или недопечатаю? Нет, спасибо, мне такого дерьма не надо.
          • +1
            Это отключается одним кликом в настройке поиска.
            • –1
              Ну, вот лень мне разбираться. Зачем менять старый работающий порядок на что-то новое, что надо заново изучать почти с нуля? Без крайней необходимости точно не полезу в какие то там настройки поиска и\или эксплорера, дай бог знать ещё, куда прикрутили.
              • +1
                > Зачем менять старый работающий порядок на что-то новое

                Потому что новый удобнее и экономит кучу времени — не нужно искать панель управления в меню, не нужно вспоминать, в каком же пункте панели спрятана нужная настройка, не нужно искать этот нужный пункт в панели управления. Достаточно вбить на старте имя нужной настройки.

                > дай бог знать ещё, куда прикрутили

                Прямо в меню Старт/Поиск и прикрутили, в режиме поиска там шестерёнка появляется.

                Даже если не отключать web results, винда лезет в интернет только за подсказками автодополнения поиска, а не за собственно результатами.
  • 0
    > Предложения по упрощению-улучшению профилировщика принимаются.
    Класс Microseconds можно заменить на функцию.
    • 0
      Попробую ещё раз, s_o_v_a, зачем нужен класс без состояния с перегруженным оператором ()? http://ideone.com/me0LfF
      • +1
        Попробую объяснить. Смысл был в запоминании под виндой результата вызова QueryPerformanceFrequency()
        Затем, почитав про то что таймер может менять частоту и прыгать (в том числе и назад на некоторых глючных системах!), сделал два вызова последовательно.
        Функция упростит понимание, в принципе можно исправить.
        • 0
          Есть такой чудесный хак http://ideone.com/OxOXAx
          • +1
            static QWORD freq = QueryPerformanceFrequency();

            Упс, нет, так не работает.
            Это майкрософтовское придется завернуть во враппер.

            У меня же получается один класс вместо двух функций. Я выбираю пикачу!
            • 0
              Конечно не работает, а вот так будет
              static QWORD freq;
              freq = QueryPerformanceFrequency();
              • +1
                Вот так вот не работает.

                static LARGE_INTEGER freq;
                QueryPerformanceFrequency(&freq);

                Вернее работает, но не совсем как хотелось бы.
        • +5
          Затем, почитав про то что таймер может менять частоту и прыгать (в том числе и назад на некоторых глючных системах!), сделал два вызова последовательно.
          Вам бы почитать документацию. QueryPerformanceFrequency() спроектирована так, чтобы давать постоянное, а не плавающее значение. Я даже более скажу, это значение один раз инициализируется во время загрузки ОС. Поэтому вызывать её больше одного раза в приложении нет смысла.
          Советую сходить в msdn
          Оно работает не то что с плавающей частотой, оно работает даже когда на разных процессорах разная частота.
          The frequency of the performance counter is fixed at system boot and is consistent across all processors so you only need to query the frequency from QueryPerformanceFrequency as the application initializes, and then cache the result.

          Is QPC accuracy affected by processor frequency changes caused by power management or Turbo Boost technology?
          No. If the processor has an invariant TSC, the QPC is not affected by these sort of changes. If the processor doesn't have an invariant TSC, QPC will revert to a platform hardware timer that won't be affected by processor frequency changes or Turbo Boost technology.

          Ну и если у вас процессор с «плавающей» частотой, то не поленитесь, вызовете QueryPerformanceFrequency и посмотрите на число, Джонни. Там не будет ничего общего с реальной частотой процессора, как и QueryPerformanceCounter не будет возвращать тики процессора, а будет возвращать тики таймера.
          • +3
            Тссс… не разрушайте человеку его уютный мир велосипедостроения.
          • –9
            Люди которые пишут что значение на некоторых системах может меняться видимо не существуют. Один ты умный, умеешь читать документацию.

            Давно считаю хабр отхожим местом.
            • +2
              Люди которые пишут что значение на некоторых системах может меняться видимо не существуют.
              Конечно существуют. Вот вы, Джонни, их яркий представитель. Почитали где-то там, а теперь сами пишете об этом.
              Давно считаю хабр отхожим местом.
              Ваша регистрация и комментарии тут говорят об обратном.

              • –5
                Серьезно? :)
                Тут же вроде айтишники, где твоя логика?
                Почему ты используешь бабскую шаблонную риторику = стандартные попытки набить цену говну.

                А что если все дураки с хабра — просто бабские фейки.
                • +3

                  Хм, да вы еще и сексист, я смотрю.

                  • –7
                    Назови мне 5 баб, которые что-то новое создали в области компьютерного зрения.
                    Назови мне 5 баб, которые выпустили инди игры.
                    Хоть одну бабу, которая создала физический движок.
                    Ладно, слишком сложно. Хоть половину такой бабы. Хоть четверть! Половинку жопы?
                    Что мешает? Вся информация открыта, можешь — бери и делай.
                    Чувствую что сейчас польется инфа что надо было в машинки играть в детстве, вот тогда…

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

                    Там внизу еще и ПГМнутый нарисовался, про грехи вещает :D

                    ХАБР!.. ХАБР! ХАБР!
                    Как лай больной собаки.
                    • +1
                      Аллах подери, тут такое же болото как и в убогих социальных сетях, куча зомбей которые верят в равенство, демократию и баб ученых.
                      Жесть жестяная.


                      «Ну, не верю я, что черномазый на пианино может играть!» (С)
                    • +1

                      Я и говорю — сексист. Вся информация открыта, а найти лень.


                      Anthropy, Anna
                      Houlden, Sophie
                      Khandaker, Mitu
                      Love, Christine
                      Short, Emily


                      Продолжать?


                      И еще, извините, не могу удержаться: Маргарет Хэмилтон. Инди-игр, правда, не выпускала...

  • +2
    Можно ли давать объектам короткие имена
    НУЖНО.
    argument a1

    Я, конечно, не настоящий сварщик, но по-моему old_dir, current_dir, new_dir даже в пределах пол-экрана читаются гораздо легче, чем dir1, dir2, dir3. Или например label, time понятнее чем просто l, t. ИМХО короткие имена нужны только для общепринятых названий счётчиков: for i, j in ...

    • 0
      Никто не говорит о шифровании имен. У вас три директории, совершенно очевидно что читателю надо дать понять чем они отличаются.

      Примеры с label и time
      label l
      time t
      В пределах пяти строк где имя используется 10 раз в громоздких конструкциях.
      • +6
        В пределах пяти строк где имя используется 10 раз в громоздких конструкциях.

        Тем более, если используются в громоздких конструкциях. Громоздкую конструкцию, наполненную a, b, dd, n1, глазами с первого раза очень трудно распарсить. Сравним чиатемость:


        set -e
        label="$2"
        dbname="$3"
        time="$(date +%Y-%m-%d-%H-%M-%S)"
        dir="$backup_dir/$label-$time"
        log="$log_dir/backup-$label-$time.log"
        mkdir "$dir"; cd $dir
        foobar-dump --db="$s" --do-not-eat-much-memory --include-important-data --fuckup-everything=no --comment="$label" &> "$log" 

        и


        set -e
        l="$2"
        s="$3"
        t="$(date +%Y-%m-%d-%H-%M-%S)"
        d="$backup_dir/$l-$t"
        o="$log_dir/backup-$l-$t.log"
        mkdir "$d"; cd $d
        foobar-dump -D "$s" -m -E -X no -c "$l" &> "$o" 
        • –13
          Смысл мне писать, если вы не читаете или не понимаете мой ответ. Я даже пример дал.
          Монолог дурного бабуина…
          • 0
            А вы интересный собеседник…
      • 0
        А что если через месяц добавят в функцию еще пару строк, через 3 месяца еще пару строк, а через год функция уже на три экрана, а переменные в ней все еще короткие?
        Вы экономите место на винчестере?

        вместо i лучше counter
        вместо t лучше tempTime
        и т.д.
        • 0
          Вот когда будет на три экрана, тогда и напишу counter вместо i
          • 0
            А если к тому моменту, как будет три экрана, вы уже смените 4 работы, а тут будет работать человек, которому придется потратить пару часов, чтобы выяснить, что такое i и что его можно безболезненно поменять, потому что оно похоже на l, на t и еще десяток однобуквенных переменных?
            Плюс время затраченное на разрастание до трех экранов всегда сопровождалось замедленным разбирательством что такое i?
  • +1
    Много спорных моментов, и автор местами излишне категоричен, но вступление гениально же.
  • 0
    Мне кажется, эффективнее не приводить к микросекундам каждый замер, а считать всё в тиках счётчика производительности.
    А конвертировать уже при выводе сумм/средних.
  • +2
    Каждый раз подобные статьи, которые, казалось бы, учат хорошему стилю, вызывают у меня отторжение. И с каждой такой статьёй всё усиливается желание послать подальше все правила, гайдлайны, соглашения и просто писать код так, как хочется.

    Пожалуйста, хватит.
  • +4
    Большинство преступлений против человечества совершено идеалистами — не спеши в их ряды
  • –9
    В статье многое правильно, зря чела заминусовали. Но вот если следовать этому пути, то дорога на корпоративный уровень (где все деньги) закрыта. Потому что там формальное следование код-стайлу важнее смысла и пользы
  • –11
    Совет. Не стоит на хабре писать про то «каким должен быть идеальный код», просто потому-что теперь большинство обитателей хабра это школота, которым не интересен идеальный код, для которых
    <html>
    <body>
    <? echo "<p>$hello<br>$world</p>"; ?>
    </body>
    </html>
    

    предел их возможностей и потолок навыков.
    • –5
      о! заминусовали =)
      правда глаза режет? =)
      • +5
        > большинство обитателей хабра это школота, которым не интересен идеальный код
        Чтож вы тогда в нашем отстойнике забыли?
    • –3
      Как работает демократия и всяческие общественные голосования можете посмотреть на примере нашего правительства.
      И хабра )
      • +3
        На закрытую тусу кто-то врывается и говорит, что тут все лохи, а потом удивляется, что он тут кого-то обидел. По вашему, реакция на таких неадекватных выскочек должна быть другой? Я считаю, это вполне ожидаемая реакция.

        Да, хабр иногда бывает ошибается, но минусы или плюсы — это мнение каждого хабровчанина, которые хоть и в целом адекватные, но не всегда = Истине.

        Поэтому, возможно тот, кто врывается в тусу и говорит, что тут лози — МОЖЕТ БЫТЬ и прав(нужно объяснить свою т.з.), но минусов отхватить в любом случае.

        И да, s_o_v_a, вы меня убиваете!
        • –5
          Хм… а я вам говорил что уже лет 10 считаю хабр отхожим местом? Вы тут возможно друг с другом все милые и пушистые, потому что боитесь отхватить минусов (плохой костыль).
          Но что толку, если вы все равно ведете себя как обезьяны или как бабы: при любом удобном поводе верещите что вы крутые, а доказать вам это совершенно нечем :)
          Я минусов не боюсь, потому что в этом курятнике мне делать нечего.
          Статью хотелось где-нибудь опубликовать для эксперимента, выбрал хабр за беленький интерфейс :)

          Кстати, даже геймдев.ру с его «проэктами» адекватнее чем хабр.

          Чтобы не быть голословным:
          Пример выше — человек мне пишет: метасообщение «твой код — говно» (завуалировано ставит себя выше меня и больше ему ничего не нужно).
          Ему ставят 10 плюсов.
          Я ему: покажи как делаешь ты (мой интерес чисто технического плана, обезьянья ерунда меня не интересует).
          Мне ставят 10 минусов.

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

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

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

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

          Я надеюсь все объяснил, по обезьяньей тематике мне больше сказать нечего.
          По коду — welcome.
          • +3
            Хм… ну попробую на твоём языке:

            Чувак, ну всё же банально — не общайся на своём, обезьяньем, языке, и тебя будут понимать! Тут не стадо бабуинов, как ты привык, тут думать надо, что пишешь!

            Плаксик, не плач, ну смотри вот комментарий:
            >>Код самописного профайлера — восхитительный пример того, как его разработчик совершает геноциды.

            у него 10 плюсов… почему? Потому что: велосипеды всех достали (знаешь сколько профайлеров создано?), потому что почти в каждом велосипеде наломана куча дров. По твоим есть немало вопросов в комментариях.

            А вот твой комментарий:
            >> Уями можно и столб покрыть, а толку. Покажи как надо, Джон.

            у него 12 минусов, знаешь почему? https://habrahabr.ru/info/help/rules/ Вот список того, чего на ресурсе делать не следует: «Оскорблять других пользователей, не следить за эмоциями.», «Постоянно использовать смайлики, коверкать слова, игнорировать правила русского языка»
            А ещё потому, что аллегория ну совсем не соответствует фразе «покажи как делаешь ты». Обычное быкование из подворотни.

            PS пожалуйста, не публикуйтесь здесь больше, я не хочу читать статьи школьников, у которых пригорело. А вы именно на этот уровень своей статьей (и ещё ниже своими комментариями) метите.
            • –2
              Ну тут я с Вами не соглашусь. Я вот например опубликовал статью, даже инвайт за нее получил, и тут же набежала школота, которая без всяких аргументов и вообще каких-либо более-менее адекватных объяснений просто заминусовала статью, за что я теперь отхабренный. Где в этой ситуации адекватное поведение?
              • –2
                Адекватное поведение в том, чтобы: а) не обращать внимание на карму и б) никогда не писать заметок на хабр.

                Джоэл и Джефф немного подумали над политикой ачивок на StackOverflow: там у контрибьюторов производная всегда положительна, каких бы ультра-взглядов ты ни придерживался. Тут все сделано через жёлудь: «элитный» клуб для несостоявшейся малышни бальзаковского возраста и неспособных овладеть английским языком, все серьезные авторы давно ничего не пишут, только «восторженная молодежь» (за что им искреннее спасибо, кстати).

              • 0
                заминусовала статью, за что я теперь отхабренный.

                Вообще-то, за заминусованную статью нельзя стать отхабренным.

              • +1
                Почитал сейчас вашу статью. Полезного в ней нет, поэтому, чтобы такая статья взлетела — её должно быть интересно читать. С этим вы не справились. Поэтому минусы на статью — адекватное поведение, имхо.
                • –2
                  Пока публика здесь будет считать, что минусы за вложенный труд (вне зависимости от результата) — адекватное поведение, гадюшник останется гадюшником, к сожалению.

                  Человек же ясно пишет: «опубликовал статью, даже инвайт за нее получил, […] просто заминусовали статью, за что я теперь отхабренный». Сиречь, пришли люди, которые сами пока от горшка два вершка, и наставили минусов в карму (сужу по «отхабренному»), — что полностью подавило любое желание (да и возможность) хоть что-то писать еще.

                  Если вам кажется это моделью адекватного мира, у меня для вас плохие новости: когда-нибудь вы сами столкнетесь с тем, что выполните какую-либо волонтерскую задачу хуже, чем могли бы. На то может быть миллион причин. А вас, к примеру, забанят. Потому что «IMHO минусы — это адекватное поведение».

                  Поэтому вот прямо сейчас я описываю процесс создания «быстрых таблиц» на хуках в Riak’е, но вы лично вряд ли ее прочитаете (хотя, в принципе, мне было бы не впадлу перевести ее на русский и опубликовать) — именно потому, что мне нафиг не вперлось мнение гуру теоретического высера.

                  Не нужно думать, что я обижен на местную публику, или типа того, вовсе нет. Я плюнул, завел еще аккаунт. Когда-нибудь его снова сольют за то, например, что я недолюбливаю golang. Делов-то — заведу еще один. Для резюме, ссылок и приятных бесед у меня есть учетка на SO.

                  Такие дела.

                  • +1
                    Следуя вашей логике можно решить, что минусы вообще не нужны, потому что минусы — это не адекватно.
                    На самом деле вы их не так понимаете. Минусы тут нужны не для того, чтобы обидеть автора, а чтобы производить фильтрацию интересного контента от не интересного. По плюсам и минусам автор может понять понравилась данная статья сообществу или нет.
                    Если вы такой нежненький, и боитесь минусов — то у вас есть два выбора. Либо не выходить на сцену писать, либо подготавливать материал очень тщательно.
                    Скажите, вы читали статью McLotos-а? Я не нахожу его статью качественной. Хотя я сам минусов ему не ставил — я прекрасно понимаю почему его статья в минусе.
                    Если вам кажется это моделью адекватного мира, у меня для вас плохие новости: когда-нибудь вы сами столкнетесь с тем, что выполните какую-либо волонтерскую задачу хуже, чем могли бы. На то может быть миллион причин. А вас, к примеру, забанят. Потому что «IMHO минусы — это адекватное поведение».
                    Если меня как вы описали забанят — я постараюсь сделать выводы. Мне саморегулирующаяся модель нравится, потому что мне не надо копаться в куче мусорного контента, который начнут тут генерить, если запретить минусы.

                    Когда-нибудь его снова сольют за то, например, что я недолюбливаю golang.
                    Недолюбливать вы можете что угодно, и тут за это не сливают. А сливают за то, что начинаете навязывать свое мнение другим, либо разводите холивар.
                    • –2
                      Вы здесь зарегистрированы с 2012 года, а я с 2006 https://habrahabr.ru/users/matiouchkine/

                      Не понимаете вы, а не я. Кроме того, вы невнимательно читаете. Гипотетический «я» не боюсь минусов за статью, которые нужны, важны и даже полезны. Статья уползет вниз и мы ее не увидим, тут все отлично, на SO так же. Но здесь есть еще эта пресловутая карма. Которая как раз влияет на возможность публикации и комментирования.

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

                      И еще, вам, полагаю, сто́ит отучиться разговаривать менторским тоном. Это выглядит, как минимум, странно, учитывая сопутствующие факторы.

                      • +1
                        Которая [карма] как раз влияет на возможность публикации

                        Да не особо она влияет на возможность публикации, будем честными. Ограничение на "раз в неделю" — это такие мелочи.

                        • 0
                          Видите ли, вопрос ведь не столько в «подождать пару дней», сколько в «а оно мне надо?».

                          Если мне ясно дают понять, что в коллективе меня видеть не хотят, я в этот коллектив не хожу. Более того, я считаю это нормальным естественным для разумного человека поведением.

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

                          Замечу также, что я активно пишу всякие заметки под CC, активно участвую во всякой открытой разработке и так далее. Я бы с удовольствием контрибьютил и сюда, да я так и делал, впрочем, пока мне не сказали: «нам тут нужно „приятно“, а не „полезно“». Ну ок.

                          • +1
                            Видите ли, вопрос ведь не столько в «подождать пару дней», сколько в «а оно мне надо?».

                            Ну так если не надо, то… и не надо. Зачем себя мучать-то?


                            Если мне ясно дают понять, что в коллективе меня видеть не хотят, я в этот коллектив не хожу. Более того, я считаю это нормальным естественным для разумного человека поведением.

                            Мне, в общем-то, кажется, что смысл кармы именно в этом.

                            • +1
                              > Ну так если не надо, то… и не надо. Зачем себя мучать-то?
                              А никто себя и не мучает. Вы появились в середине треда, который начался с того, что я объяснил, что не так в консерватории. Ad hominem аргументы тут (как и везде) абсолютно неуместны.

                              > Мне, в общем-то, кажется, что смысл кармы именно в этом.
                              Я слышал, что есть люди, которые считают, что большинство всегда право. И им, наверное, здесь очень комфортно. И это прекрасно.

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

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

                              • 0
                                Ad hominem аргументы тут (как и везде) абсолютно неуместны.

                                Аргумент ad hominem — это немножко другое, не подменяйте.


                                Понимаете, есть один маленький, очень странный нюанс во всей этой аргументации: чтобы поставить минус в карму, нужно чтобы в собственной карме было достаточно плюсов. А плюсы — это тоже следствие реакции некоего общества. Так что да, местная динамика и правда так устроена, что есть поощряемое и непоощряемое поведение… и мне кажется, что это нормально для общества.

                                • –1
                                  Зависит от того, какие цели преследует общество.

                                  Если цель — теплая, уютная, ламповая и плюшевая атмосфера — безусловно.

                                  Если же на профессиональном ресурсе вам почему-то небезразлично качество статей — то все иначе. Иногда имеет смысл потерпеть. Подумайте, что тут стало бы с каким-нибудь Эйнштейном или, тем паче, Торвальдсом? То-то.

                                  • 0
                                    Если же на профессиональном ресурсе вам почему-то небезразлично качество статей — то все иначе. Иногда имеет смысл потерпеть.

                                    Я вот в этом не уверен. Когда мне нужны статьи без атмосферы — весь интернет к моим услугам, сейчас площадок для собственного высказывания бесконечное множество, я RSS перестал успевать прочитывать.


                                    Подумайте, что тут стало бы с каким-нибудь Эйнштейном или, тем паче, Торвальдсом?

                                    Это бы их остановило?

                                    • 0
                                      В чем вы не уверены? Там дихотомия :)

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

                                      > Это бы их остановило?
                                      Их бы заминусовали по самое незабалуйся.

                                      • 0
                                        В чем вы не уверены? Там дихотомия

                                        В том, что если небезразлично качество статей, надо потерпеть. Собственно, я считаю, что это ложная дихотомия.


                                        Их бы заминусовали по самое незабалуйся.

                                        Их бы это остановило?

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

                                          >> Их бы заминусовали по самое незабалуйся.
                                          > Их бы это остановило?
                                          Понятия не имею. Но количество полезной информации от них точно бы уменьшило.
                                          • +1
                                            Вы утверждаете, что грубиян никогда ни при каких условиях не способен написать блестящую научную работу?

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

                                          • +1
                                            Энштейна с его ОТО поносили во всём научном сообществе достаточно продолжительное время… Куда там хабру с холиворами до тех проблем, с которыми он столкнулся…
                                • 0
                                  знаете, что первым делом прилетает, когда кому-то указываешь на логические ошибки в том, что человек говорит?
                                  а знаете, что первым делом прилетает, когда говоришь кому-то противное его «вере»?
                                  слава богу, с течением времени таких людей будет все меньше, а все больше будет тех, кто не сможет ни писать, что захочет, ни голосовать.

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

                                    Знаю. И что?

                                    • –1
                                      Дурак стал нормой, еще немного — и дурак станет идеалом, и доктора философии заведут вокруг него восторженные хороводы. А газеты водят хороводы уже сейчас. Ах, какой ты у нас славный, дурак! Ах, какой ты бодрый и здоровый, дурак! Ах, какой ты оптимистичный, дурак, и какой ты, дурак, умный, какое у тебя тонкое чувство юмора, и как ты ловко решаешь кроссворды!.. Ты, главное, только не волнуйся, дурак, все так хорошо, все так отлично, и наука к твоим услугам, дурак, и литература, чтобы тебе было весело, дурак, и ни о чем не надо думать… А всяких там вредно влияющих хулиганов и скептиков мы с тобой, дурак, разнесем (с тобой, да не разнести!). (с)
                                  • 0
                                    Большинству нравится, когда большинству не перечат :)

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

                                    Не всем людям это одинаково очевидно, к сожалению.

                                    • –1
                                      Да ладно, вот на гиктаймсе только что наткнуля на комментарий про бесов и злых духов распространяющих порок от пользователя с 7 комментами на гиктаймсе и 11 на хабре, а так же кармой по 9 единиц на обоих ресурсах (которую, как понимаю, заработал на хабре одной статьей с 6 комментами под ней).

                                      Собственно это все, что нужно понимать, разговаривая о «саморегулирующейся» (сарказм) системе хабра.
                                      Большинство даже не заметит, если внутри у него будут сидеть те, кто незаметно выкосят право этого самого большинства решать что либо. Собственно, вспоминая одного гениального ботовода и лидера донатерских кланов встреченного мной в одной из игр, при особом желании на хабре такой человек мог бы за полгодика-год даже статьи о РПЦ в топ выводить.
                                      Но уже сейчас решает не сообщество и большинство, далеко не они.
                                      • 0
                                        так же кармой по 9 единиц на обоих ресурсах (которую, как понимаю, заработал на хабре одной статьей с 6 комментами под ней).

                                        Вообще, так работать не должно, разве что кто-то от большой любви, прочитав статью здесь, пошел плюсануть в двух местах.

                                        • 0
                                          статья 12 года, до разделения, боюсь где-то там собака покопалась.
                                          • 0

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

                                            • –1
                                              В любом случае это просто показатель того, кто действительно имеет право голоса на хабре.
                                              А мне так вообще по большей части все равно на все эти танцы с кармой — смысла писать статью на хабр не вижу ни какого, а без этого карма лишь повод заведения «клонов» у ридонли пользователей, то бишь совершенно бесполезная побрякушка.
                                  • +3
                                    Проблема только в том, что уж очень много в последнее время здесь появилось дурачков, или прикидывающихся таковыми, которые, получая негативный отклик на свои грубые, хамские по форме высказывания, начинают прикрываться тем, что их будто бы поносят «по политическим мотивам». Нет, друг, это ты к людям относишься, как к говну, и за это тебя поносят. А не за то, что ты ломаешь чьи-то стереотипы или ломаешь чей-то привычный мир.
                                    • 0
                                      Мои комментарии в большинстве случаев оценивают нейтрально-положительно, всего три комментария с "-1" на хабре, например. Да-да, я очень оскорбительное хамло.

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

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

                                      Зато ваш комментарий прям идеальный образец вашей терпимости и того, что вы лично к другим относитесь не как к говну, да-да. Или я лично вам когда-то дорогу перешел и не помню?

                                      PS. Кстати, я никогда не маскирую оскорбления. И, насколько помню, за последнее время конкретно оскорбления отвесил трижды на гиктаймсе. В теме о смерти создателя Руборда. Можете меня за это распнуть.
                                      • +2
                                        Или я лично вам когда-то дорогу перешел и не помню?

                                        А при чем здесь вы? Я разве сказал, что речь о вас? Ваш комментарий был с рассуждениями «в общем» вида «а знаете, за что минусят?». Я отметил другую интересную тенденцию.

                                        А заминусили в основном не за политику

                                        Мое «по политическим мотивам» написано именно так — в кавычках. Так, на всякий случай, если вы не обратили внимание.

                                        Зато ваш комментарий прям идеальный образец вашей терпимости и того, что вы лично к другим относитесь не как к говну, да-да

                                        Да, мой комментарий вполне нейтрален. Нет, я лично не отношусь к другим как к говну.
                                        • –1
                                          «А при чем здесь вы? Я разве сказал, что речь о вас?»

                                          Нет, конечно же Вы говорили не обо мне, это же явно видно из построения Ваших фраз:

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

                                          Ну, либо Вам надо поработать над нейтральностью комментариев. Например, не писать в них «ТЫ» в ответе другому человеку, если Вы пишете не о нем.
                                          • +1
                                            Это обращение к тому условному человеку, действия которого я критикую, а не к вам. Заметьте — я описываю конкретные действия, которые подвергаю критике, совершаемые условным человеком, и потом обращаюсь к нему, условному. Вы не совершаете эти критикуемые действия? Тогда это обращение не к вам.
                                            Это обычная фигура речи. Представьте себе фразу вида «Мда, идешь ты так по улице, никого не трогаешь, тут раз и окатывают тебя из лужи». Здесь слово «ты» не применяется по отношению к собеседнику, это лишь фигура речи, способ ее разнообразить. Точно так же, как если мы говорим «идешь по улице до конца, поворачиваешь налево, там подходишь к киоску...». Все описывается в настоящем времени, хотя в настоящее время второй человек никуда не идет и не поворачивает, а вовсе стоит и слушает собеседника.

                                            Например, не писать в них «ТЫ» в ответе другому человеку, если Вы пишете не о нем.
                                            Это не был ответ в полном смысле слова, это реплика после ваших слов на заданную ими тему. Поскольку мы общаемся в виде текстовых сообщений, единственный способ показать, что это реплика после и на заданную кем-то тему — офомить ее в виде ответа.
                          • 0
                            Если мне ясно дают понять, что в коллективе меня видеть не хотят, я в этот коллектив не хожу. Более того, я считаю это нормальным естественным для разумного человека поведением.
                            Но почему же вы аж 15 раз заводили виртуалов? Судя по комменту выше. Это разумно?
                            • 0
                              Следующую строчку не судьба прочитать?

                              Я хожу в комментарии. Но я больше не пишу статьи. Комментарий — общение с живым человеком. Статья — с коллективом. Я не знаю, как еще проще объяснить.

                              • 0
                                Вы ошиблись адресом. Комментарии — почти такое же общение с коллективом, разница только в объёме собираемой аудитории.
                              • 0
                                Ошибаетесь. Комментарии — это так же общение с коллективом, потому что их читают все. Общение с человеком — это когда вы ему в личку пишете.
                                Так вот, отрицательная карма никак не влияет на общение с человеком. С человеком тут можно общаться даже с read-only аккаунта, у которого кармы вообще нет.
                                • –1
                                  Во-первых, императивы тут не очень уместны. Вы (и два комментатора вокруг) странно трактуете понятие «общение». Вот я вам ответил, а им — нет, с вами я общаюсь, а на них — класть хотел с прибором. То, что каждый волен прочитать мою реплику и что-то ответить не делает из такого сорта переписки — общение.

                                  Во-вторых, если вам, по какой-то причине, непонятен термин «общение», я за него не держусь. Давайте назовем это «сепулька». Так вот: в комментариях мне иногда интересно, а статьи я на русском писать больше не стану. Так понятнее?
                                  • 0
                                    Да понял я вас. У вас своя точка зрения, у меня своя. Не вижу в этом ничего плохого. Предлагаю на этом и закончить. ;)
                              • 0
                                Комментарий — общение с живым человеком

                                Вы перепутали с личной почтой.
            • 0
              Да и статьи из серии «я нашел перевод статьи о том как изобрели круглое колесо» тоже порядком поднадоели, хочется если не чего-то нового, то хотя бы какой-то свежий взгляд, коего на хабре последнее время стало совсем мало, сейчас в основном либо переводы либо просто наглое копирование текста с каменных скрижалей, которое выдается за «мои вчерашние размышления».
              А когда пишешь что-то реальное, то к этому начинают придираться.
            • –8
              Во первых это ты на своем языке.
              Во вторых, конструктива в твоем посте ноль, очередная макака.
              Так что по коду хотел сказать? Меня интересуют замеры, позволяющие с легкостью делать алгоритмическую оптимизацию под разными системами: windows, linux, android, ios. В моем профайлере меньше 200 строк кода и он позволяет все это делать не напрягаясь, хоть на удаленном устройстве. Это мой основной инструмент оптимизации.
              Предложи мне «не велосипед», делающий все то же самое, но лучше.

              Макаки, вы мне надоели. Как можно быть такими тупыми и агрессивными.
    • 0
      Не стоит писать про то, каким должен быть идеальный код, потому что «идеальный» — крайне субъективное понятие. И посты вида «Я считаю именно этот код красивым, а ваше понятие о красоте неправильно» минусуются за дело. Особенно если эти посты написаны в таком брызжущем слюной стиле.

      Мне вот, например, на код с префиксами смотреть приятнее, чем без них. Мне тоже создать пост, который префиксы хвалит?
  • +1
    > Замечание: ограничение на имена файлов 8.3 снято более 20 лет назад.

    Замечание: ограничение на имена файлов 8.3 **появилось** чуть более 30 лет назад и было снято более 20 лет назад. Нормальные люди, впрочем, этого ограничения вовсе не заметили, потому что оно появлялось и исчезало только в нишевой ОС для бухгалтеров.

  • +1
    По-моему пример с программистом Джоном некорректен. Как можно складывать затраченное время разных людей (пользователей) и помещать всё это в одну событийную линию?.. Тогда программа должна быть написана минимум 427.8 лет назад. Разные потоки данных проходящие параллельно нельзя складывать. Тоже самое что сложить время выполнения разных потоков программы в один и сказать, что это время выполнения всей программы…
    • 0
      Но если это время они сидели на работе, то за это время в итоге заплатят именно деньги за указанное время.
      Да и ведь проблема чаще не в том, что ошибка единожды появилась и пришлось потратить время на ее решение, а в том, что в итоге того, что программист то в одном, то в другом месте не потратил лишних пару часов на подумать, а пользователи потом будут месяцами тратить по 5-10 минут каждый день по несколько раз в день из-за ошибок разработки.

      Пример из жизни:
      При запуске программа автоматически посылала запрос на загрузку данных из БД по всем заявкам за период от дня до нескольких месяцев (до тысячи заявок в день) в зависимости от значения фильтра на момент предыдущего закрытия программы.
      Хотя на самом деле пользователю после запуска нужно было после этого настроить пару фильтров и получить единственную конкретную заявку, ну максимум несколько по одному пациенту.
      Итого, запуск 5-10 минут был нормой (скорость работы запросов — отдельная песня), а программа достаточно постоянно падала, чтоб ее за день раз пять перезапускать приходилось.

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

        Речь идёт, всё таки, не о деньгах, «убитых программистом Джоном», а о времени…
        • 0
          потому что любые аналогии — лживы и говорят больше об их авторе.
          но для демонстрации существования проблемы такая гипербола вполне себе допустима, главное не относиться к ней слишком серьезно.
  • –2
    Автор молодец

    namespace std вообще надо бы сделать включенным по умолчанию, стандартная библиотека на то и стандартная.
    Понятно что пока оно не так, старый код с конкурирующими именами где-то еще есть. Но зачем в таком стиле писать новый код.
    Старый код можно изолировать с течением времени в отдельные модули с отдельными настройками namespace (спрятать за опции препроцессора или компилятора).
    Но, может быть, раньше чем все это случится, придет новый более удобный высокопроизводительный язык.
  • +6
    Очень зацепила агрессивность автора (далее Джонни). По этому отпишу
    1. Джони, скольких людей ты убыл, опубликовав эту статью?
    Если анализировать мир с подобным подходом, то получится следующее:
    каждый день на тебя смотрят люди и тратят свое время. Пусть будет 50 человек по 30 секунд (условно, начиная с 20ти летнего возраста).
    Получается 1500 секунд в день. Пусть, условно, это будет продолжаться еще 30 лет. Получаем 4562 часа, делим на 16 (кстати, ты спишь по 8 часов, Джонни, тебе повезло). Итого, Джонни, ты потратил 285 человеко-дней. Скольких ты убил?

    Каждый день ты тормозишь других людей, глобализацию никто не отменял. Скольких ты убил?
    А сколько времени потратила на тебя твоя мама? Ты убиваешь свою маму! Подумай об этом, Джонни.

    С такой логикой рассуждений — мы убиваем жизнь вокруг нас, которая в свою очередь убивает нас. Спасибо кеп. Действительно отличная жизненная позициция. Следующий раз когда тебя будут медленно обслуживать в Маке скажи менеджеру, что они тебя убивают (я буду смеяться вместе с ними)

    2.
    Ну извини, 5 лет в геймдеве, сейчас по компьютерному зрению — не профессионал.

    Извени, но когда я вижу подобное, мне хочется в очередной раз блевануть (первый раз — во время прочтения коментов, в первую очередь твоих). Нифига себе у тебя мнение о себе. 5 лет опыта уже проффесионал? В плюсах? Пройдя через гейм дев?
    Как правило профессиналы так не кичаться. И уж точно не лажают, обсырая определенные подходы и выкладывая файл который содержит подходы которые они обсырают. Согласись, Джонни, звучит глупо

    Геймдев геймдеву рознь. И багов там очень много. И можно 5 лет фиксить баги и словить звезду. 5 лет опыта -теперь я бог, синьйор и могу все обсырать как захочу. А все остальные ничего не понимают.
    5 лет в геймдеве тоже ни о чем не говорит. Потому что есть очень много сфер и технологий, которые геймдев не затрагивает. Так что извольте не претендовать на истинность с 5тью годами в геймдеве.

    Комьютерное зрение… пойми, Джони, это словосочетание никого уже не пугает лет 5.
    И снова таки, компьютерное зрение компьютерному зрению рознь. Прикручивать openCv к апликушке на андроиде и разрабатывать алгоритмы дополненой реальности это две разные вещи. Первое не впечатляет, а второе не претендует на определяющую часть девелоперской темы.

    Так что следующий раз, Джонни, не убивай людей своими статьями. А лучше запусти машину (с помощью уже готового решения) обучать нейронную сеть (с уже подобранными параметрами) и молись, что в этот раз ты разметил свой датасет лучше, чем в прошлый…

    P.s.
    Ни в коем случае не хотел обидеть людей занимающихся геймдевом и комп. зрением. Плюсую всем, каждому свое.
    Просто Джонни зацепил своим профессионализмом.
    • –2
      «Извени»

      Картина маслом.
      • +1
        Бывает, не бери близко к сердцу
  • +4
    А затем я упростил эту функцию, без ущерба ликвидировав дублирование: split

    Вы в курсе, что ваша функция не всегда работает правильно (==«убивает»)?

    Объявление функции допускает использование произвольной строки в качестве delimiters:
    void split(const string& s, std::vector<string>& result, const string& delimiters = " ");

    Например, если я сделаю вызов:
    split("aSaSSaSSSa", result, "SS")
    то результат будет:
    "a", "a", "a", "a"
    вместо ожидаемого:
    "aSa", "a", "Sa"

    Если выложил в интернет — удали.
    Если удалил — сделал добро людям.

    Сделайте доброе дело: удалите ваш код из этой сатьи, пока кто-либо его не скопировал.
    Или хотя бы поправьте и протестируйте перед выкладыванием (да еще с претензией «у меня лучше, чем в Boost»).
    • 0
      Глубоко копнули. Не поспоришь!
    • 0
      В принципе, произвольная строка может задавать набор разделителей. т.е. «AB» — не разделитель AB, а разделители «A» и «B».
      В случае с SS как цельным разделителем в части aSSSa возикает неоднозначность: разбиения «a», «Sa» и «aS», «a» — верные, если у нас нет дополнительных ограничений.
      • +1
        Да, если строку считать набором одиночных символов, каждый из которых считается отдельным валидным разделителем, то функция работает правильно. Но если так не считать, то она ошибочна.

        В любом случае, очевидно нарушение автором своих же правил:
        Комментарии
        Если вы пишете понятный код с разумными именами, то комментировать вам практически нечего. Только места с неочевидными вещами, хаки. Лучше потратьте энергию на короткое описание что же все таки делает этот модуль.
  • +1
    int i;
    char c;
    byte b;
    string s;
    vector v;
    pointer p;
    argument a1;


    Вы там что курили?
    • +2
      Да, вот я тоже, кстати, сразу же заметил; должно же быть консистентно:

      argument a;
      


      :)
  • +4
    > Средний мужчина живет 64 года, значит Джон убил примерно 6 целых 68 сотых человека.
    Продолжим логику в том же духе: Джон своим кодом ускорил выполнение кода на 15 минут. Значит Джон родил* примерно 6 целых 68 сотых человека. Поздравляем Джона! Теперь он многодетный отец и мать в одном лице! Если каждый так сделает, то население Земли увеличится на 600 млн человек, а количество многодетных отцов станет 25% Земли!

    *родил — по аналогии, ведь в статье говорится «убил»

    /sarcasm off: просто в статье приводится неверное сравнение, про сохранение времени людей. Сохранив 15минут людям, этот человек не прожил бы дольше, а скорее всего просто занялся бы другим простым делом — включил телевизор, налил чаю или выпил пива, посмотрел котиков итд. Но уж точно не логично говорить про *убил* столько-то людей, ведь в моём пример выше — сохранив им это время, людей больше бы не родилось.
    • +1
      более верным антонимом в данной аналогии был бы: воскресил)

      Так что можно вводить ачивки от плохого к хорошему для разработчиков:
      массовый разработчик
      серийный разработчик
      индивидуальный разработчик
      милосердный разработчик
      святой разработчик
      БОГ!
      • 0
        если уж есть БОГ с одной стороны, то должен быть кто-то с другой? :-)
        • 0
          Я все же думал, что хватит и разработчика массового поражения.
          Но если так, то, вспоминая библию в плане массовых зачисток…
          Предлагаю, как в математике с ± ∞.

      • +3
        «Плохой код убивает, хороший код воскрешает»?
        Отличное название под следующую подобную статью!
        • 0
          Самый страшный грех — это гордыня!
  • +1
    Товарищи, пожалуйста, не кормите тролля. Честно говоря давно не видел таких толстых экземпляров и тем более не ожидал увидеть на хабре.
    • 0
      Я думаю, он пришёл с тостера, там очень похожий персонаж обитает: Rou1997.
    • 0
      А чем хабр так уж прямо отличается от какого-нибудь reddit’а? Элитарностью?

      • 0
        Хз, я не знаю как на реддите карма работает, здесь такие товарищи обычно в минусе сидят
  • 0
    Историю про Джона уже видел в соц сетях и считаю логику про убийство людей крайне дефективной. Особенно не нравится идея распространения этой, простите за выражение, туфты, и построение на ней каких-то умозаключений и производство выводов.
  • 0
    По теме:
    Крайне не согласен с
    int i;
    char c;
    byte b;
    string s;
    vector v;
    pointer p;
    argument a1;

    Короткие имена ужасны! Читаемость кода обычно снижается, так как некоторые сокращают по принципу: «ну, я же понимаю».
  • 0
    Возьми в проект огромный boost, занимающий несколько гигабайт места на SSD диске

    ну во-первых про несколько гб это сильное преувеличение. Ыо-вторых велосипедостроение это плохо, а ведь действительно написал один костыл — избежал буста, в след. раз: «А вроде буст и не нужен же сейчас, двайте еще велосипед запилим» и так много раз — код сложнее и костыльнее. В-третьих открой для себя уже bcp. В-четвертых regex — часть stl уже давно.
  • 0
    int i;
    char c;
    byte b;
    string s;
    vector v;
    pointer p;
    argument a1;


    Как-то я работал над таким проектом, где у объектов были такие именна в функции с парочкой вложенных циклов и ифов. Структура кода не сказать, что была бы сложная, но когда доходишь глазами до нижнего уровня уже забываешь что таакое «i», приходиться возвращаться в начало, а там забываешь откуда ты перешел. Внятное имя решило бы эту проблему.
  • 0
    А нужно лишь придерживаться следовать Codestyle для языка на котором вы пишете.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.