?

Log in

Dennis Gorelik
By juan-gandhi:
---
1) Мутабельные ключи в "хашмапе".
2) Стек для регистрации данных для последующей проверки, что мусора не осталось. Т.к. указатель на стек глобальный, а бегают несколько ниток, то чистый абсурд.
3) Класс на 183 метода, 0 тестов.
4) Регулярно, случайным образом, рушащиеся тесты, и святая вера, что "за последние несколько лет у нас ничего не ломалось".
5) Вера в то, что у нас все очень "эффективно" - и регулярные жалобы юзеров, что наш код очень медленный, в отличие от скального конкурента (!)
6) "Оптимистический мерж" - "это не мой тест упал, я тут не при чем, нам нужно релизить.
---

1) Интересно, зачем кому-то понадобилось делать мутабельные ключи в хашмапе?
2) Мне лично не встечалось, хотя при работе в multithread environment каких только ляпов не сделаешь...
3), 4), 5), 6) - мне в том или ином виде встречалось.

Originally posted at: http://dennisgorelik.dreamwidth.org/125941.html
 
 
Dennis Gorelik
27 February 2017 @ 01:55 am
From "Committing code often" discussion:
It is ok to make mistakes, especially in the first "rapid-fire" version of the code.
There is no shame in it.

Even more: if you are not making any mistakes while coding - that means you are way too careful and are working much slower than you can.
(That does not mean, of course, that you should intentionally do mistakes. Just take greater risks in order to improve speed of programming/coding until you start getting occasional mistakes).

Originally posted at: http://dennisgorelik.dreamwidth.org/125623.html
 
 
Dennis Gorelik
26 February 2017 @ 05:38 am
I asked a developer on my team to commit code frequently: at least once per day or more.
Even if feature is not ready - commit parts of this feature, prototypes, or even mixture of draft code and draft notes.

The developer objected that:
1) Not every feature fits into one day of development. (I agree with that).
2) Commiting raw code, and especially committing raw notes - effectively publishes them.
And publishing raw ideas - makes them to prematurely solidify, which, in turn, negatively affects future research, because there is a bias toward solid ideas, while alternative solutions are more likely to lose even if they are good.
(I kind of agree with that effect, but only partially. Publishing ideas solidify them a little, but that effect is more positive than negative).
3) Commiting/publishing raw notes violates developer's privacy, because raw notes represent unfiltered train of thoughts.
(My thinking is that since these notes were created as an attempt to find a solution to a work problem - there raw notes are very unlikely to contain any personal secrets. Raw notes can still contain weird thoughts or even silly mistakes, but that is OK - there is no need to be ashamed of mistakes in early research thoughts).

My main reasons to have code committed frequently is:
1) Check that work goes in the general direction that is likely to satisfy business goals.
2) Review new research and code in reasonably small chunks, so that code reviewer is able to understand them.
3) See not only final polished solution, but also mistakes and research dead ends along the way. That helps learning more.

What do you think: is trying to commit code at least once per day - too frequent or a good goal?

Originally posted at: http://dennisgorelik.dreamwidth.org/125416.html
 
 
Dennis Gorelik

5:46
"Вот завтра случится какая-то большая разборка внутри кремлевской мафии и они сожрут Путина, поставят на его место Шойгу или какого-нибудь Лаврова, и мы еще увидим самого Путина с заявлениями о том, вообще-то все 17 лет он мечтал сделать Россию свободной. Он хотел, очень хотел отпустить всех заключенных, но все его указы на эту тему блокировали плохие бояре. А вот все те миллиарды долларов, которые получил он и получила его семья - его просто заставили взять под угрозой, конечно, неминуемой смерти."

Originally posted at: http://dennisgorelik.dreamwidth.org/125176.html
 
 
Dennis Gorelik
16 February 2017 @ 10:34 pm
For many years already I am using Skype Phone (1-904-425-9555).
I receive incoming calls from all over the world, call to the US and Canadian numbers every day and occasionally call to international phone numbers (India, UK, Russia, Australia, South Africa, Nigeria, etc.)

Skype charged me less than $90 per year.
Here are my transactions for the last year:
--------
Skype Number, 12 month subscription $40.12 (charged in February 2017)
Unlimited US & Canada 12 months $26.88 (charged in February 2017)
Skype Credit (for outgoing calls to other countries) $10.00 (charged in June 2016)
--------

Skype is a little bit messy with their billing (not immediately clear what "You sent a payment of $26.88 USD to Skype Communications Sarl
(paypalpayments@skype.net)" mean), but after finding out how much does Skype Phone actually cost to me - it seems like a good deal.

What do you use for your phone?

Originally posted at: http://dennisgorelik.dreamwidth.org/124793.html
 
 
Dennis Gorelik
13 February 2017 @ 11:26 am
В ЛДНР приехал воевать новый политрук: Захар Прилепин.

У Захара - очень хорошо подвешенный язык:
==================
http://rusplt.ru/society/zalog-sohraneniya-ukrainyi--vhojdenie-v-sostav-rf-19125.html
Вспомните Первую мировую войну, какой был патриотический подъем — но прошло три года, и тот же народ, который бегал с флажками, шил носки на фронт, писал солдатам письма, разнес армию, страну, а когда расстреляли царскую семью, этого даже никто и не заметил.
...
Сейчас и антипатриотизм моден как никогда
...
вроде бы патриоты, за Россию и за ее успехи, сеют определенный элемент розни. Если бы им дали возможность управлять ситуацией, не уверен, чтобы они решили бы, например крымский вопрос, из-за их действий крымские татары бы взорвались так, что их потом бы никто в жизни не успокоил.
...
К власти, конечно, у меня менялось отношение на фоне крымских событий и всех последующих. Каким-то образом Владимир Владимирович Путин извлек свой входной билет, дающий возможность находиться внутри мирового политического истеблишмента, свою путевку на Лазурный Берег, где он мог бы по окончании срока вместе с другими бывшими президентами пить шампанское и вспоминать дела давно минувших дней, — а он эту путевку порвал и выкинул. Он там уже не окажется. Мне нравится, что он себя таким образом повел, теперь он находится в контексте нашей страны, среди своего народа и никуда от нас не уйдет. Не в смысле с президентского кресла, а от своей ответственности за свои поступки и побуждения, он обязан заботиться обо всех нас, о будущем страны, потому что это его личное будущее тоже. Это очень весело и трогательно. Все поступки, которые он совершает, отрывают последние нити, которые связывают его с мировым истеблишментом. Потом, он кинул часть своего окружения, которое глубоко и прочно вписано в мировые финансовые системы. Это тоже приятно, за это тоже спасибо, тоже не могу не оценить.
...
Мы считаем, что мы наследники Древней Руси и Золотой Орды, Россия — это и то и другое. Украинская идея, что они Древняя Русь, а мы Орда, просто антинаучна. Дело в том, что мы теряем в геополитическом плане большой медийно-идеологический козырь. Мы должны про это снимать фильмы, показывать, как огромнейшее количество ордынских князей переходит на сторону русских, как они берут вместе Казань, тем более что тут ничего даже придумывать не надо, это историческая правда.
==================

Путинская команда с удовольствием превратит Захара в героя. Посмертно.

Thanks to: novich-ok

Originally posted at: http://dennisgorelik.dreamwidth.org/124567.html
 
 
Dennis Gorelik
05 February 2017 @ 02:51 am
1) "Мальчиша-Плохиша" неприятели с ипподрома толкнули под травмай.
--------
https://ru.wikipedia.org/wiki/Тихонов,_Сергей_Михайлович
Артист Сергей Мартинсон сомневался, стоит ли ему играть в фильме «Сказка о Мальчише-Кибальчише», но когда познакомился с Серёжей и разыграл с ним этюд: «Пряник медовый дашь?… А два дашь?… А теперь халву давай, да побольше, а то не скажу…» — согласился.
В 1966 году Сергей окончил 8 класс школы № 90 Краснопресненского района. После съёмок в фильме «Дубравка» пытался поступить во ВГИК (курс С. А. Герасимова и Т. Ф. Макаровой), но не был принят. Отслужил в Советской Армии. После демобилизации стал завсегдатаем ипподрома. Сергей, вследствие своей известности и общительности, очень быстро стал там своим человеком. Но продолжалось это недолго. Возник конфликт, который стоил ему жизни. Поздним вечером 21 апреля 1972 недалеко от ипподрома его столкнули под проходящий трамвай. Сергей скончался до приезда скорой помощи.
--------

Мальчиш-Плохиш в фильме "Сказка о Мальчише - Кибальчише":
https://youtu.be/L2m4XyXAUqU?t=387

2) "Мальчиш-Кибальчиш" переехал во Флориду, где управляет компанией, занимающейся ультразвуковым тестированием брони и солнечных панелей.
=========
https://ru.wikipedia.org/wiki/Остапенко,_Сергей_(актёр)
Родился 5 июня 1952 года. До роли Мальчиша-Кибальчиша в 1958 году Сергей сыграл пионера Альку в фильме «Военная тайна» (также по Аркадию Гайдару).
Получил высшее математическое образование. Эмигрировал в США, живёт во Флориде, в пригороде города Тампа. Преподаёт в Университете Южной Флориды[1][2][3]. Президент компании Ultrasonic Technologies, Inc.
=========

---
http://www.ultrasonictech.com/news-20130129-ceradyne-body-armor-ruv.html
“RUV tools are currently used in solar cell and fuel cell manufacturing. With this project for Ceradyne, the RUV technology is expanded to the market of ceramic-based armor plates”, commented Dr. Sergei Ostapenko, President and CEO of Ultrasonic Technologies, Inc. “Our ultimate goal is to deploy portable, accurate and cost-effective RUV units to commercial and military customers, to significantly enhance protection and endurance of human personnel in the battlefield.”
---

Сергей Остапенко ("Мальчиш-Кибальчиш") в фильме "Биохимия предательства":
https://youtu.be/9pEP9qsKoRA?t=208

Originally posted at: http://dennisgorelik.dreamwidth.org/124252.html
 
 
Dennis Gorelik
From LJ discussion:

> A manager that requires that besides doing my job I also teach him programming (e.g. explain why atomicity is important), and then comes with "brilliant" suggestions and/or more questions, is the worst kind.

Thanks - that is a clear explanation.
I strongly disagree with you on that and believe that you are making a serious mistake by rejecting people who want to challenge you and learn from you.
It hurts you in two directions:
1) You are losing the opportunity to test and clarify your mental models.
2) You are losing the opportunity to identify your selling points and practice your sales pitch.

Actually you are not exactly following your stated preference. You are teaching people and allow to challenge yourself.
You mentioned Monitor.Pulse() in this thread.
But you are doing only a half-assed effort in that direction. In particular, you chose to shut down the discussion when it hit the stage of an actual practical code recommendation.
You could show to me and to everyone who will be reading this thread that you are a closer who delivers practical solutions. But you chose to stay at a vague state of hinting that you may know something but not really proving it.
You chose to avoid getting your practical solution criticized (and therefore did not test and did not allow a chance of improving your tech skills as a result of that tech discussion).

I and best professionals I know - like to share what they know, and in particular they are eager to explain what their expert opinion is based on.

Warren Buffet - teaches his financial investments craft all the time.
Bill Gates shared his line of reasoning in a couple of books and multiple interviews.
The best performing air conditioner technician that I met - encouraged me multiple times to ask him questions and was eager to explain how air conditioning works, what to do and what to expect.

That story repeats over and over again.

I myself encourage people around me to challenge what I know and am eager to teach what I know: business, technology, politics, sales, social skills, etc.

I strongly encourage you to do that yourself. It will turn your life to the better.

Originally posted at: http://dennisgorelik.dreamwidth.org/123933.html
 
 
Dennis Gorelik
03 February 2017 @ 02:18 am
In the last couple of days I learned quite a bit about multithreading:
1) How to create new thread in order to fix hangs in crawler.

2) That creating new threads has performance penalty (about 10 ms 0.15 ms per creation of a new thread).

3) That Task has good performance (almost no performance penalty) because it reuses thread pool.

4) That if you use Task (thread pool) you cannot really kill the hanging thread, so using Task Factory does not really help in solving a hanging thread issue.

5) How to create our own thread factory that is running single thread and how to kill that thread if it runs for too long.
In particular:
- How to use two EventWaitHandle objects in order to communicate appropriately between main thread an background/worker thread.

- When it is the right time to exit from the infinite loop in background thread in case if service is shutting down or pausing. (Exit background thread in case of pause/shutdown only if it is idle - to prevent confusion in the business logic of the client code).

using System;
using System.Runtime.ExceptionServices;
using System.Threading;

namespace PostJobFree.Utilities
{
	public static class ThreadHelper
	{
		private static EventWaitHandle CompletionWait;
		private static EventWaitHandle InputWait;
		private static Thread CurrentThread;
		private static Exception ThreadException;
		private static Action ActionToExecute;
		private static readonly object LockObject = new object();

		public static bool ExecuteOnSeparateThreadWithTimeout(Action action, TimeSpan timeout)
		{
			lock (LockObject)
			{
				ThreadException = null;
				ActionToExecute = action;
				if (CurrentThread == null // First-time execution or previous thread was aborted due to timeout
					|| !CurrentThread.IsAlive) // Service was paused
				{
					InitializeCurrentThread();
				}
				InputWait.Set();
				if (!CompletionWait.WaitOne(timeout))
				{
					CurrentThread.Abort();
					CurrentThread = null;
					return false;
				}
				if (ThreadException != null)
					ExceptionDispatchInfo.Capture(ThreadException).Throw(); // To preserve stack trace
				return true;
			}
		}

		private static void InitializeCurrentThread()
		{
			CompletionWait = new EventWaitHandle(false, EventResetMode.AutoReset);
			InputWait = new EventWaitHandle(false, EventResetMode.AutoReset);
			CurrentThread = new Thread(WorkerThread);
			CurrentThread.Start();

		}
		private static void WorkerThread()
		{
			while (true)
			{
				if (InputWait.WaitOne(TimeSpan.FromSeconds(1)))
				{// Action is requested
					try
					{
						ActionToExecute.Invoke();
					}
					catch (ThreadAbortException)
					{
						return;
					}
					catch (Exception ex)
					{
						ThreadException = ex;
					}
					finally
					{
						CompletionWait.Set();
					}
				}
				else
				{// 1 second passed with no Action request
					if (ExecutionCore.NewExecutionAllowed) continue; // To allow exiting on Pause
					return; // Exit on (NewExecutionAllowed = false) only if background thread has nothing to do
				}
			}
		}
	}
}

using System;
using System.Threading;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using PostJobFree;
using PostJobFree.Utilities;

namespace TestIjSearch.Utilities
{
	[TestClass]
	public class ThreadHelperTests
	{
		[TestMethod]
		public void ThreadHelperExecuteOnSeparateThreadWithTimeoutTest()
		{
			Assert.IsFalse(ThreadHelper.ExecuteOnSeparateThreadWithTimeout(() => Thread.Sleep(10000), TimeSpan.FromTicks(1)));

			Assert.IsTrue(ThreadHelper.ExecuteOnSeparateThreadWithTimeout(() => { }, TimeSpan.FromSeconds(1)));

			bool exceptionHappened = false;
			try
			{
				ThreadHelper.ExecuteOnSeparateThreadWithTimeout(() => {throw new PostJobFreeException();}, TimeSpan.FromSeconds(1));
			}
			catch (PostJobFreeException)
			{
				exceptionHappened = true;
			}
			Assert.IsTrue(exceptionHappened);

			try
			{
				ExecutionCore.NewExecutionAllowed = false;
				int result = 0;
				Assert.IsTrue(ThreadHelper.ExecuteOnSeparateThreadWithTimeout(() => { result = 111; }, TimeSpan.FromSeconds(1)));
				Assert.AreEqual(111, result);
				//Thread.Sleep(TimeSpan.FromSeconds(2)); // It allows asynchronous thread to die/exit if (NewExecutionAllowed = false)
				Assert.IsTrue(ThreadHelper.ExecuteOnSeparateThreadWithTimeout(() => { result = 222; }, TimeSpan.FromSeconds(1)));
				Assert.AreEqual(222, result);
			}
			finally
			{
				ExecutionCore.NewExecutionAllowed = true;
			}
		}
	}
}

Update: LJ discussion.

Originally posted at: http://dennisgorelik.dreamwidth.org/123635.html
 
 
Dennis Gorelik
02 February 2017 @ 10:27 pm
How do you convince a senior developer to write unit tests even when he thinks that his code is easy to understand?

I already tried:
1) Unit tests have test cases that help to understand the underlying business logic during code review.
2) Having automated test coverage makes code more maintainable, because tests allow quick experiments with changing underlying implementation.
3) Tests are needed anyway (manual or automatic), so why not immediately write auto-tests during development?

Update: LJ discussion.

Originally posted at: http://dennisgorelik.dreamwidth.org/123813.html