dennisgorelik: 2020-06-13 in my home office (Default)
Today I talked with a small marketing agency owner about marketing my business (PostJobFree).
Initial conversation was scheduled for 30 minutes, but we talked for ~1.5 hours.

He started with asking about my business (sources of revenue, problems, where we are getting leads, who is doing sales and marketing, ...)

Then he swithced to the pitch: use their marketing system to setup drip email campaigns (and later LinkedIn and social media campaigns).

According to him, the key to success is in consistency of sending marketing messages (e.g. every week or every 2 weeks or every month), because average sale happen only after 5-7 interactions.
That seems reasonable.

On another hand, he is a generic marketer, without particular focus on job boarding business. So he was lacking job boarding industry insights.

I think it is important to be an expert in whatever you are marketing, otherwise marketing messages sound like generic spam.

He asked me "what budget would be ok for me to spend on marketing like that".
I was not certain, and asked for a small experiment (try to grab a small low-hanging fruit with minimal effort - in order to prove that this marketing approach works).

In the end, the marketing solution he proposed turned out to be $3000 - $5000 per month (or even more with more active marketing engagement).
Which seems to be a bit expensive experiment to me, considering that he is not an expert in job boards business.

From another perspective, full-time marketer salary could be even more than that.

Update: Marketer refuses to work on hourly base
dennisgorelik: 2020-06-13 in my home office (Default)
Today we discovered and fixed a bug that was running in our backend system for 5 years.
In theory, I know that there are long-running bugs in most complex systems. This bug was one of such practical confirmations.

The correct SQL code should have been:
NonDeliverableEmailResumeUCleanup.cs/MarkResumeUDeletedForSpamComplaint()
exec spProcessPointerGet ...
select ...
update ...
exec spProcessPointerSet ...

But due to the bug, instead of "spProcessPointerSet" MarkResumeUDeletedForSpamComplaint() had "spProcessPointerGet" (second time), so "MarkResumeUDeletedForSpamComplaint" ProcessPointer did not move after finishing batch processing.

Still this buggy system worked.
MarkResumeUDeletedForSpamComplaint() kept reprocessing spam complaint records from the beginning - instead of processing only unprocessed spam complaints.
Finally, 5 years after writing this buggy code, one of the users complained that PostJobFree deletes his resumes several minutes after he post them. We started to investigate and, eventually, found this bug.
dennisgorelik: 2020-06-13 in my home office (Default)
1) Today (2020-05-04) my email client (The Bat 9.1.18 Professional) - lost ability to receive or send emails from our corporate @postjobfree.com email addresses [that G-suit handles for us].

The Bat started to return "Server reports error. The response is: 5.7.0":
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
!2020-05-04, 06:18:43: SEND - Server reports error. The response is: 5.7.0 https://support.google.com/mail/?p=WantAuthError h188sm3660946qke.82 - gsmtp
2020-05-04, 06:18:43: SEND - connection finished - 0 message(s) sent
2020-05-04, 06:18:43: SEND - Some messages were not sent - check the log for details
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
(Times are in EST)

2) The reason for this error is that Google [temporarily] stopped supporting "Less Secure Apps" in G-Suite (which we use to manage postjobfree.com emails).

3) This instruction: https://hotter.io/docs/email-accounts/secure-app-gmail/ is now obsolete.
"Less secure app access panel" no longer exists on https://myaccount.google.com/security page.

4) Actually, less secure access to Gmail works again, but, most likely, only temporary.
=======
https://gsuiteupdates.googleblog.com/2020/03/less-secure-app-turn-off-suspended.html
Last December, we announced that we’d be turning off less secure app (LSA) access to G Suite accounts, and that you should migrate to OAuth authentication instead. The first phase of the LSA turn-down was scheduled for June 15, 2020. As many organizations deal with the impact of COVID-19 and are now focused on supporting a remote workforce, we want to minimize potential disruptions for customers unable to complete migrations in this timeframe.
As a result, we are suspending the LSA turn-off until further notice. All previously announced timeframes no longer apply.
...
Despite these timing adjustments, Google does not recommend the use of any application that does not support OAuth.
=======

5) This is the fix for this The Bat - Gmail issue:
~~~~~~~~~~~~~
https://www.ritlabs.com/en/news/6777/
To configure OAuth for existing Gmail or Mail.Ru accounts in The Bat!, users should access the "Account -> Properties -> Transport -> Receive mail -> Authentication" menu, enable "OAUTH (using Web Browser)" and save changes. The Bat! will remove the password from the account and apply the modern authentication mechanism to send and receive messages.
~~~~~~~~~~~~~

Click "Authentication":


Switch from "Regular" to "OAUTH (using Web Browser)":


6) The Bat works again.

7) The next step - is to switch our PostJobFreeService C# code that works with Gmail over [secure] Smtp/Pop3 to OAuth.
dennisgorelik: 2020-06-13 in my home office (Default)
Our geocoding loop detector -- found Google Maps bug.

Google Maps search for "quweisna,menofia governorate,egypt"
points to "quwaysna,menofia governorate,egypt".

Searching for "quwaysna,menofia governorate,egypt" points back to "quweisna,menofia governorate,egypt".

Quwaysna is about 1 mile away from Queisna:
dennisgorelik: 2020-06-13 in my home office (Default)
We use 2 geocoding providers: Mapbox (primary) and Google Maps (as a backup when Mapbox produces weird results).

Using 2 geocoding providers, occasionally, causes weird data collisions.
For example:
Mapbox API geocodes "north beach, MD,20714" as "west beach, MD,20714", but Google Maps API geocodes "west beach, MD,20714" as "north beach, MD,20714".
That, effectively, forms geocoding loop:
~~~~~~~
west beach, MD,20714
north beach, MD,20714
west beach, MD,20714
north beach, MD,20714
west beach, MD,20714
...
~~~~~~~

This geocoding loop may cause infinite redirect between job list web pages:
-----
"West beach" jobs page redirects to "North beach" jobs page.
"North beach" jobs page redirects to "West beach" jobs page.
...
-----

Yesterday we launched Geocoding loop detection code, and found over 50 geocoding loops in our 901,016 records GeocodedLocation table.

Some other geocoding loops examples:
=======
san francisco,ca,94105 <-> south beach,ca,94105
northeast washington,dc,20018 <-> washington,dc,20018
miami,fl,33132 <-> downtown,fl,33132
far rockaway,ny,11691 <-> queens,ny,11691

kankan,guinea <-> kankan region,guinea
amhara,ethiopia <-> amhara region,ethiopia
jigawa,nigeria <-> jigawa state,nigeria
manzini district,swaziland <-> manzini,swaziland
=======
dennisgorelik: 2020-06-13 in my home office (Default)
I just spent 4 hours on the phone talking with a scammer.

He started with telling me his fake business story: petroleum drilling operations and hiring security guards to protect these drilling operations.
He explained that they are only hiring Americans, even for work overseas, because he is a big American patriot.

Then he told me his life story (he's 69 now), and, eventually, his true business story.

He sells background checks to "security guard" job seekers for $198 per report.

He promises to job seekers that these background checks go directly to the prospective employer that may hire them for $71,000 - $100,000 per year (too good to be true).

He ran his "Internet business" for about 20 years and changes about 20-30 identities (personal names, corporations, bank accounts, websites) over these years.

He likes President Trump, because Trump is selling hope and is successful at that.
His business somewhat declined since Trump become a President, because more people have jobs now, so the demand for hope is not as high.
His business at the times when "Black President" was at power was more successful (thanks to high unemployment) and he sometimes was making more than $1,000 per day.
dennisgorelik: 2020-06-13 in my home office (Default)
Our 2-years experiment with using NUnit as a unit testing framework is complete.
We migrated to MSTest V2.

My conclusions:
1) MSTest is more reliable than NUnit.
See NUnit screw up.
2) MSTest is slightly simpler/restricted than more flexible/complex NUnit.
3) MSTest is slightly faster than NUnit (about 7%).

But generally, MSTest and NUnit are comparable.

This article helped us to migrate:
https://cklutz.github.io/2018/10/30/Convert-NUnit-To-MSTestV2/
dennisgorelik: 2020-06-13 in my home office (Default)
In spite of Skype being buggy, Skype turned out to be the best choice for us.
Our PostJobFree team stopped using Zoom and switched back to Skype again.

The main reasons for switching back to Skype:
1) The quality of Skype voice connection is, usually, better than Zoom's.
2) If there are issues with voice connection in Skype -- Skype shows that.
Zoom, unfortunately, tries to hide problems with voice connections and keeps silent if it cannot deliver voice signal. That turns bad problem (I know that there is a poor connection) into a very bad problem: I do NOT know if person on another end of Zoom is silent of it is a bad connection.
dennisgorelik: 2020-06-13 in my home office (Default)
One of Ukrainian programmers I hired one year ago (let's call him "The Dude") took a 3 weeks break for his University session.

This was the third session break already.
The Dude wrote "Session will be finished at 8 of June."
I asked him to focus on finishing session and then come back to work full time.

The Dude stopped replying to our emails (that was ~expected until June 8). But then he did not show up on June 8 either.

So I decided that he decided to silently quit (like it already happened with 2 my other remove programmers I hired in the past).
But no - the dude showed up June 25 (17 days later after the planned end of his University session) as if nothing happened.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The Dude 2019-06-25 15:34
Hello. I can work again and, as I understand, we need to talk about it.

Dennis 2019-06-26 00:45
Why are you showing up only now? I thought you are gone completely without notice.
You wrote "Session will be finished at 8 of June."

The Dude 15:56
I have some personal problems and spend more time on session. Only yesterday I finished course work)

Dennis 15:56
Why you did not tell us that you had these problems? You could, at least, write an email.

The Dude 15:58
I watched time to time to email and zoom. Nobody ask me, so I decide that no problem.

Dennis 15:59
That is not correct attitude. And in fact, you received emails with direct questions to you, but did NOT reply.

The Dude 16:01
Yes, I saw them.
First about time, which I poorly remember, when I check it.
Second looks like just notice, that Andrey solved crash in another way and I need to review it.

Dennis 16:03
If you do not remember, you should reply anyway. You are not a princess that we all should run around.
I told you multiple times about importance of timely communications. I told you multiple times that you are severely undercommunicating. But you just reject to learn it. So for me it seems hopeless.

The Dude 16:06
I know that, I am not a princess)
I just decide that it's not a problem.
Okay, sorry for that.

Dennis 16:07
Breaking promises is a problem.

The Dude 16:07
What promises do you mean?

Dennis 16:07
Promise to show up on June 07.

The Dude 16:10
I already told, that I have some problems and unfinished session.
I told that I will start to work after session, as we discussed. You don't accept partial work, so I decide to continue when I will can work without delays.

The Dude 16:24
Well, okay, maybe it's better)
About work and time.
Can I send invoice about time, which I worked before delay?

Dennis 16:33
Yes, please send the invoice for the time you already worked.

The Dude 16:33
okay

Dennis 16:34
Deciding to continue with your session and other business was OK.
Not notifying us about your decision -- was NOT ok, and makes you unreliable worker (which we do NOT need).

The Dude 16:41
Okay, understand you.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dennisgorelik: 2020-06-13 in my home office (Default)
Edward from Google Ads (former Adwords) asked me to change my "Post jobs for free" ad campaign strategy from "target cost" to "maximum conversions within budget".

This is an annoying tactic of a short-sighted salesperson that sells ads.

What Edward calls "budget" is, actually, an "ad spending limit" that I use as a protection against accidental overspending due to mistake in my ad campaign settings.

My wish is NOT to spend my "budget" every month. I want to get an optimal results for my money (more recruiter registrations per $ amount spent).
If I am getting good results - I may increase my budget. But spending my whole budget every day simply because I defined that "budget" -- is a sloppy advertising strategy.

It is funny how Edward confused "budget" and "spending": my "PostJob-ResponsiveSearchAds" campaign has $7/day budget and zero spending, but Edward said that "PostJob-ResponsiveSearchAds" campaign "is spending 7 dollars on".

I told Edward that I do not need his advice, because I do not consider it relevant to my goals.
dennisgorelik: 2020-06-13 in my home office (Default)
Couple or years ago we tried to reuse exception handling code and created this method:
public static void ExecuteEmailCrashSuppressWebException(Action tryAction, Action reportAction)
{
	var tl = new TimeLog();
	try
	{
		tryAction();
	}
	catch (WebException) { return; }
	catch (Exception ex)
	{
		string displayName = tryAction.GetDisplayName();
		string message = CookMessage(displayName, reportAction, tl, ex);
		string subject = $"Win crash: {displayName}()";
		Log.ToFile(message, displayName + ".log");
		EmailToDevelopers.EmailTextIfSubjectWasNotSentRecently(subject, message);
	}
}

The idea was that if we know that a method may crash then we would just pass that method as a "tryAction" parameter.
Then ExecuteEmailCrashSuppressWebException() will swallow web exceptions, and will notify us (developers) about all other exceptions.

We wanted to avoid repeating try-catch boilerplate code by reusing ExecuteEmailCrashSuppressWebException().

That attempt [to reuse try-catch] failed miserably. Every tryAction method needed its own custom exception handling:
- In some cases we needed to swallow WebException, but in other cases we wanted to log it.
- In some cases we wanted to write to one "{tryAction}.log" file, but in other cases we wanted to write to differently named log file, or not to write to log file at all.
- Log message content was quite different for different tryAction methods.

Eventually we deleted ExecuteEmailCrashSuppressWebException() and wrapped every individual method that needed custom exception handling - by its own try-catch block of code.

My conclusion is:
Try-catch block should wrap only direct method calls.
Almost never try-catch should wrap Action/delegate invocation (such as "tryAction()").
The reason why wrapping delegate invocation with try-catch does not work is that "catch" implementation is very custom for every individual method.
Merging all these custom implementation into a single "catch" block produces unmaintainable mess.
dennisgorelik: 2020-06-13 in my home office (Default)
I am teaching my team members to be more proactive in criticising [potential] mistakes of others, and be more humble and grateful in receiving criticism.

Receiving critical feedback is important for effective teamwork.
dennisgorelik: 2020-06-13 in my home office (Default)
A confused job seeker, by mistake, posts his cover letter as a job posting:
-------
Job Title: Civil Site Engineer
Location: Doha, Qatar
---
Sir I am Mahendiran completed B.E Civil Engineering with 3 years site experience in India.If any job vacancy kindly inform about me.I am living in Qatar with transferable visa NOC. I have good knowledge with computer.
-------

Then he applied for his own job posting.
Then, in the following 4 weeks, 9 more desperate job seekers applied for that "job posting"...
dennisgorelik: 2020-06-13 in my home office (Default)
For hiring a web parser software developer I interviewed several candidates and gave them this test task:
===
Download job page like this and extract job description.
===
This candidate extracted job description, but his extracted job description included "Apply now" wording from the button below job description.

During "test task follow-up" interview I pointed out to that bug.
The Candidate refused to admit that this is a bug. His reasoning was: the result includes job description (therefore my requests to remove irrelevant noise from results are nit-picking, and it was my responsibility to define task clearly).
I insisted that it was a bug. (Note that I did NOT insist that it is too late to fix this bug).

I conducted interview in English, but the candidate asked to switch to Russian.
After I made a clear "no hire" decision, we switched to Russian and talked a little bit.
The candidate suddenly disconnected during this talk.
Few days later, he contacted me again.
Below is a follow-up conversation from Skype chat:
---
[10:26:30] Candidate: Привет, Денис! Извини, я тогда был чуток не в себе, созвон был не вовремя.. Т.к. я с бабой разошелся, и всю ночь бухал и возможно был на нервах, не в адеквате. Я не хотел тебя ничем обидеть. Желаю тебе успехов в бизнесе и в жизни.
[10:27:19] Dennis: Спасибо. Желаю тебе успеха в поиске работы.
[10:27:31] Candidate: Спасибо
[10:34:42] Candidate: Я сделал проект, о котором говорил. Мой клиент полностью доволен и он желает работать постоянно. У него тоже контора своя, готовят новые задачи. Возможно будет смысл создавать платформу. Посмотрим, без работы не буду.
[10:35:46] Dennis: Если у тебя получается хорошо работать с нынешним клиентом, то расширение объема работы с ним - разумная стратегия.
[10:37:15] Candidate: Думаю да, есть смысл. Это все по сути копейки, и оплата по задачно. Но хоть что-то. Все равно время будет и для других задач.
[10:38:34] Dennis: Если ты сделаешь бизнес твоего клиента более успешным, то он будет пользоваться твоими услугами все больше. Ну и, конечно, при неполной занятости имеет смысл искать дополнительные контракты.
[10:43:39] Candidate: У меня есть и свои идеи для скрапинга, и партнерских сетей... Мой еventine изначально имел схожие корни с keen.io, heap... Есть над чем работать, там посмотрим. Лишь бы время было.
[10:45:22] Dennis: Я тебе рекомендую работу на заказчика (или заказчиков) вместо независимых проектов. Работать самостоятельно - на порядок сложнее.
[10:45:55] Candidate: А когда я успею делать свои вещи?
[10:46:18] Candidate: Как ты успел?)
[10:46:41] Dennis: Если ты хочешь больше времени уделять своему хобби, то ты можешь работать меньше (например 20-30 часов в неделю).
[10:46:57] Dennis: Я работаю 60+ часов в неделю.
[10:47:17 | Edited 10:47:24] Candidate: Но ты уже работаешь над своим, верно?
[10:48:22] Dennis: Да, над своим бизнесом. Но когда я начинал, я работал полный рабочий день + 20-30 часов в неделю над своим проектом.
Если тебе хочется такой жизни на 5-10 лет вперед - можешь попробовать.
[10:48:46] Candidate: Сколько тебе лет?
[10:48:51] Dennis: 43
[10:49:11] Candidate: И доволен ли ты результатом потраченного времени?
[10:49:56] Dennis: Доволен, но правильность выбранного пути - неочевидна.
[10:50:16] Candidate: Согласен
[10:50:57] Dennis: Кроме того, я и ты - разные люди. Ты живешь жизнь по-другому. Тебе свой собственный бизнес подходит меньше, чем мне.
[10:51:13] Candidate: Почему ты так решил?)
[10:51:43] Dennis: Например потому, что я никогда и никому не давал таких интервью, как ты.
[10:52:27 | Edited 10:53:30] Dennis: Когда ты рискуешь только тем, что тебя не возьмут на работу - это приемлемо (хоть и нежелательно).
Когда ты так рискуешь своим бизнесом -- это неприемлемо, потомучто построить бизнес занимает много лет.
[10:55:41] Candidate: То уже было не интервью :)
[10:56:32] Candidate: Изначально все было нормально. Людей понимать так же нужно, в этом тоде большой плюс, как и осознавать свои ошибки.
[10:56:58] Dennis: Конечно нужно понимать людей.
[10:57:15] Dennis: Для этого я тебя и интервьюировал.
[10:58:05] Dennis: Что это было, по-твоему, если не "интервью"?
[11:13:17] Candidate: Интервью - первый колл. Все остальное, это уже беседа, тем более в воскресенье, если говорить пл деловому. Я извинился за свое поведение, и объяснил ситуацию.
[11:14:15] Candidate: Не хочу спорить с тобой, хоть и есть свое мнение.
[11:14:53] Candidate: Пусть останется так, как считаешь ты.
[11:17:23 | Edited 11:18:42] Dennis: Спасибо - я понял, как на это смотришь ты.
Я часто интервьюирую людей в форме, которая для них выглядит "просто беседой". Интервьюирую -- необязательно по работе.
[11:19:39] Candidate: У меня был такой прикол, что мы после интервью, пошли с работодателем и набухались в хлам, ведя просто разговоры о жизни. И я получил работу в тот же день, заказчик - простой чувак, без понтов. Мне импонируют такие люди с которыми просто и все понимают. Так проще работать.
[11:20:27] Dennis: Конечно же надо работать с теми, с кем у тебя есть взаимопонимание.
[11:21:34] Candidate: Именно
[11:23:31] Candidate: Я не пью в рабочие дни принципиально. Могу себе позволить пару бакалов пива в пятницу или вино под мясо на выходные. Очень редко хожу на тусы. Просто эти выходные были тяжелые для меня, и я все переживал очень болезненно. Не нужно судить меня не зная меня.
[11:24:49] Candidate: Я поэт с 14 лет, музыкант, из хобби кулинария, психология, оружие, рыбалка, охота, женщины:)))
[11:25:12] Candidate: У меня на подоконнике даже горох растет)))
[11:26:09] Candidate: Я когда общаюсь, так же изучаю человека
[11:26:43 | Edited 11:26:51] Candidate: Возможно, иногда провоцирую, дабы понять психотип
[11:26:56] Dennis: Я считаю, что нужно судить постоянно (просто аккуратно рассматривать все факторы).
Ты считаешь по-другому. И не понимаешь, почему я считаю, что судить нужно постоянно.
Что говорит об отсутствии хорошего взаимопонимания.
[11:31:41] Candidate: Зачем судить кого-то? Пояснт мне, пожалуйста. Ведь смысл взаимодействия именно в понимании... Работа и отношения вне работы - разные вещи. Вот, напимер, если бы я нажрался из-за бабы в рабочий день, имея контракт с тобой - такого бы не было... Потому что у мея есть долг перед тобой, командой, компанией. Это ответственность. Но в воскресенье, не имея еще с с тобой никаких обязательств, я имею право нажраться и двинуться головой. Понимаешь о чем я? Нельзя говорить обо мне о таком в постоянном векторе, т.к. это лишь оценочное мнение и не характеризует меня как личность или как сотрудника, исполнителя.
[11:33:24] Dennis: Судить - для того чтобы принять правильное решение для себя.
[11:33:41] Dennis: Суждение - улучшает (и тестирует) понимание.
[11:34:33] Candidate: Ок, пусть для тебя это будет так.
[11:34:55] Dennis: Конечно ты имеешь право нажраться.
А я имею право не работать с теми, кто нажирается, особенно если это влияет на результаты рабочего взаимодействия.
[11:35:14] Candidate: Хорошо
[11:35:26] Candidate: Пусть будет так
[11:36:55] Dennis: Я стараюсь не использовать мыслей типа "Ок, пусть для тебя это будет так", потому что это означает, что я плохо понял собеседника.
[11:38:23] Candidate: Хорошо, я виноват. Я плохой человек. Нажрался в воскресенье. Не выолнил рабочие задачи, прокидал проект и т.д. Ты имеешь полное право судить меня со своей стороны и зделать негативные выводы.
[11:40:24 | Edited 11:41:15] Dennis: Я думаю, что я сделал позитивные выводы: что нам с тобой лучше вместе не работать. Так будет лучше и для меня и для тебя.
[12:08:38] Candidate: :) хорошо, Денис
[12:08:58] Candidate: Раз уж ты считаешь меня таким ничтожным и плохим.
[12:09:04] Candidate: Но, спасибо
[12:09:13] Dennis: Я тебя не считаю ничтожным и плохим.
[12:20:35] Candidate: Денис, я всю жизнь сталкиваюсь с проблемами и осуждениями со стороны своей семьи, других людей. Я всегда сам по себе. Я привык к суду себя. В меня никто никогда не верил. Привык к осуждениям. Я не обижаюсь. Но знаю точно, что мною движет особенная сила, которую я искал в других людях и много разочаровывался... Это не помешает мне достичь того, чего хочу. Хорошего дня!
[12:21:25] Dennis: Хорошего дня.
[13:06:44] Candidate: И да, я считаю ты не в компетенции осуждать меня как личность, и оценивать меня как партнера в нерабочее время. Выводы нужно делать в сугубо рабочее время и касательно выполненных задач и их качества на реальном рабочем пространстве. Спасибо.
---

Does anyone want to hire this candidate?
dennisgorelik: 2020-06-13 in my home office (Default)
Several months ago Arthur asked me if we have any remote AS400 Cobol job listings.
I had set up a job search alert for him:
---
(AS400 or AS-400 or iSeries) cobol (remote or remotely or telecommute or "from home") in United States
---

Sereral days ago, PostJobFree emailed one of job alert matches to Arthur:
==========
Cobol Developers w/zOS. 3+ Months. Telecommute Contract
COBOL development in a Mainframe Z/OS environment,
.....
Our direct client is in the process of migrating a large line of business systems from mainframe Z/OS to an iSeries platform and they require supplemental staffing to meet required deadlines.
This request is for developers experienced in COBOL running on a Z/OS platform.
.....
* QA/testing background with a mainframe and/or iSeries
==========

Arthur's reply:
And this fits an AS400 programmer how? Mainframe is NOT AS400.

Dennis:
Cobol + Mainframe -- are you saying that is not relevant to what you are looking for at all?

Arthur:
Yes. I never set up COBOL and mainframe. The AS400 is not now not ever has been a mainframe.

Dennis:
You may consider applying for this job anyway.
It is possible that they misswrote that job description or that they actually do mean "AS400" when they write "mainframe".

Arthur:
No, They specifically state z/OS which is the mainframe OS. AS400 OS is i/OS. It is why I specify AS400 or iSeries and COBOL to NOT get mainframe job listings.

Dennis:
This job description contains word "iSeries".
Does it mean that it is a possible match?

Arthur:
Where does it contain 'iSeries'? I don't see it now not did I see it before which is why I sent the et stating I should not see mainframe jobs. And this is clearly a mainframe position.

Dennis:
See in that job description below:
"QA/testing background with a mainframe and/or iSeries"

Arthur:
The bottom line is it is not a match because it needs an experienced mainframe developer “This request is for developers experienced in COBOL running on a Z/OS platform “ but I see where the search algorithm picked it up. Not sure how you could code the algorithm to recognize the mnain thing the job opening is looking for.

Dennis:
Are you getting many mismatches from PostJobFree?
If not - it may be easier to just ignore jobs that you consider not a good match (even if these jobs contain all important keywords).

Arthur:
The problem is I can’t ignore the job until I click the link to find out IF it actually meets my criteria. I would expect that the jobs would actually match my criteria but they don’t seem to. What bothers me more if the assumption that when I click on the link someone gets paid so it benefits the sender not necessarily me.

Dennis:
1) You do not have to click the link in order to evaluate job.
In the email below PostJobFree listed full job description for you. That should be enough to evaluate.
2) Why would you care if somebody else got paid for your click?
You do not have to pay for that click anyway.

Arthur:
Mu concern about who gets paid is it is an incentive to the supplier of the listing to send me junk that they would get paid if I click it whether or not it is of value to me. What I get from PostJobFree is sometimes enough to evaluate and usually it is of something that does not match my search criteria.

Dennis:
Job advertisers are smart about it, and usually pay based not on clicks, but on number of completed job applications.
In addition to that, advertisers evaluate how many candidates were, actually, successfully hired.
dennisgorelik: 2020-06-13 in my home office (Default)
Main source of revenue for PostJobFree now is advertising jobs from other job boards on CPC (cost-per-click) basis.

It works like this:
1) Advertiser (job board) gives us a link to their XML job feed.

2) Every job element in that XML job feed has associated CPC bid (or we use default CPC bid for the whole job feed).
Typical CPC bid is around $0.20/click, but it usually varies between $0.08/click and $0.50/click.

3) After some cleaning, PostJobFree saves all job feeds into a unified list of jobs (database table + ElasticSearch index).

4) When job seekers are searching for jobs, we prioritize jobs according to:
- How well this job posting matches with what job seeker is searching for.
- Advertiser jobs quality, that we measure as "clicks/unsubscribe" ratio -- based on clicks history for that specific advertiser (the higher clicks/unsubscribe ratio - the better).
- CPC that advertiser pays for jobs (the higher CPC bid is - the higher this job will be listed in search results).

5) After the end of month - PostJobFree generates invoices and emails them to the advertisers.

6) Advertisers pay on "Net 30" basis. That means "pay within 30 days from invoice period").

Usually, this CPC advertising business in uneventful, but sometimes a bit unusual email exchanges happen.

In the email exchange below an advertiser (a buyer that represents job board "Mumu") and I resolve a discrepancy between "PostJobFree outgoing clicks" number and "Mumu incoming clicks" number.
(I changed names and simplified/trimmed this conversation a little bit).

Advertiser
Hi Dennis,
We see some discrepancies for May in our numbers
PostJobFree invoice: $269
Mumu internal counting: $223
We are asking for an invoice reduction of $32

Dennis
1) You are welcome to pay that corrected invoice amount ($237).

2) Going forward could you please adjust (reduce) your bids in order to accommodate the discrepancies.
We may assume that discrepancies next month would be similar to discrepancies in May.
So, your bid should, probably, be about 12% less.

3) Do you measure your CPA conversions from PostJobFree traffic?
Does it perform better or worse than you expected?

Advertiser
1) Great. Have the invoices been re-sent?
2) I will ask for the bid mins to be reduced, no problem and thanks for the suggestion.
3) No, we measure conversions based on intention to apply, you perform very well!

Dennis
1) We did not resend invoices.
Our invoicing system currently does not support sending corrected invoices.
If it is important for you - we may send you manual corrected invoice, but this is labor-intensive.

2) Please note that if you reduce your CPC bid then PostJobFree would send you less candidates going forward.
That may or may not be the right course of action, depending on how satisfied you are with current results (e.g. "cost per application").
If you are satisfied with the results - bid the same.
If results are better than your target CPA - bid more.
If CPA is below your target CPA for that campaign - going forward bid less.

Does it make sense?

Advertiser
Thanks for the additional info.

We'll leave the bids the same, especially since it seems to be easy enough to share the discrepancy and bill off our numbers.

I'll ask our AP team if it's ok on our side to pay (our numbers) without you needing to re-issue an invoice.

Dennis
1) While one-time invoice correction is OK, it is not OK to correct our invoices on a regular basis.

If you want to have long-running adjustment - please lower your bid (and, correspondingly, have lower traffic from us).
We are running an auction [advertisers bid for job seekers' attention] and it is not ok to bid more than what you are going to actually pay (not in a long term anyway).

2) I appreciate traffic analysis on your end. It brings an interesting feedback.
In response to your feedback we may, eventually, tweak our system a little bit (e.g. discourage out-of-country candidates even more than we do now).
But there are only 2 immediate actions we can take right now:
- Allow you to pay discounted invoice (once).
- Bid less if you think that our job seekers' traffic does not worth what we charge for it.

Does it make sense?

Advertiser
Since we haven't had these discrepancies in past months, I would like to see what we see next month.

Both of the options you present penalize Mumu... either we pay for traffic that we wouldn't charge our own clients for, or we bid lower and see less traffic... neither of those are great solutions to me. I'd much prefer something that suits both you and us - we generally allow a 10% margin of error, for example, and only reach out for reconciliation when a discrepancy goes outside this range.

Dennis
1) We do not single out Mumu.
We are sending traffic that we have to all advertisers (at the prices that advertisers bid).

2) If occasionally you see lower quality traffic from us, then the best course of action - is to bid a little bit less.
For example, if once per 4 months you see 20% decrease in quality of PostJobFree traffic, you may want to bid 5% less than you would otherwise bid. In the course of ~4 months that would compensate for occasional decrease in traffic quality.

3) It is still nice to receive your analysis of our traffic quality, especially if it is something that you did not see before.

4) I suggest to increase "margin of error threshold" from 10% up to 20%
Smaller changes are easier to address by adjusting CPC bids.

Reconciliation process is time-consuming and only makes sense when quality changes significantly from regular level.

Advertiser
Thanks Dennis,

I appreciate you taking the time to go through the 'theory' behind your advice - it makes sense.

We'll definitely take it under consideration.

Have a nice afternoon
dennisgorelik: 2020-06-13 in my home office (Default)
Several days ago Microsoft released new update to Windows 10.
That update changed how this code works:
new Uri(baseUri, relativeUrl)

The difference is in how this code works in case if baseUri is malformed.

Prior to Windows 10 update this code crashed with System.NullReferenceException
After the update -- the same code no longer crashes.
[Test]
public void CompatibilityTest()
{
	Uri baseUri = new Uri("https://jobs.web.cern.ch/content/cern-jobs-insight/what-are-we-doing-while-you%E2%80%99re-waiting");
	const string badUrl = "https:/jobs.web.cern.ch/content/cern-jobs-insight/what-are-we-doing-while-you%E2%80%99re-waiting";
	var result = new Uri(baseUri, badUrl);
}

Note malformed "https:/" in badUrl.

Currently my Windows 10 machine has .NET Framework 4.7.03056 [1]
With the most recent Windows 10 update this code successfully puts into result variable:
---
https://jobs.web.cern.ch/jobs.web.cern.ch/content/cern-jobs-insight/what-are-we-doing-while-you’re-waiting
---

However on Windows Server with .NET Framework 4.7.02053 the same code crashes with NullReferenceException.

What do you think is the correct behavior for malformed baseUri input: try to guess correct baseUrl path or crash with NullReferenceException?

My guess is that Microsoft finally decided to properly fix this "malformed input" bug (and not longer crash).
If my guess is correct - then in the following versions of .NET Framework this NullReferenceException crash would disappear even on Windows Server platform.

----
[1] You may determine what .NET Framework version installed by running regedit:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full

... or by opening: Visual Studio - Help - About Microsoft Visual Studio

[2] .NET targetFramework mess
dennisgorelik: 2020-06-13 in my home office (Default)
Darya complained today that her job posting Candidates for Russian Speaking PCA in VA - does not receive any leads.

My reply:
==========
1) I created a resume search alert for you:
---
https://www.postjobfree.com/resume-alerts
russian (pca or care or caring or cna or nursing or assistant or assisting) in Herndon, VA 20170
---
You may tweak this resume alert a little in order to make it fit better to your candidates search.

2) I recommend you to update your job posting and add words "care", "caring", "cna", "nursing", "assistant" and "assisting" to the job description.
That would allow you to attract people who are searching for these skills.
https://www.postjobfree.com/my-jobs
==========
dennisgorelik: 2020-06-13 in my home office (Default)
=======
Thomas:
Probably going to delete my job alert. Just because I'm close to the border doesn't mean I want to see all the jobs being outsourced in Mexicali. You should probably figure out a way to limit the search to the US.

Dennis:
Why wouldn't you reduce your job search distance down to 20 miles?

You may also put your search location center at Slab City and use 32 miles search distance. That would cover larger search area, but still would not cover Mexicali.

I created a custom job search alert for you:
---
https://www.postjobfree.com/job-alerts
commodity or buyer or supply or purchasing or sourcing or procurement in Slab City, CA 92233
---
=======

Thomas is searching for jobs up to 50 miles away from Brawley, California 92227.

Profile

dennisgorelik: 2020-06-13 in my home office (Default)
Dennis Gorelik

May 2025

S M T W T F S
    123
45678910
11 121314151617
18192021222324
25262728293031

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated May. 19th, 2025 02:36 pm
Powered by Dreamwidth Studios
OSZAR »