The local labour market for engineers, technicians and developers is pretty much empty - as in, everybody with the skills required and the desire to live here already does.
Recruiting more often than not means sniping, or, if we're lucky - that someone has recently found a partner with desirable skills and coaxed them into moving up here.
Anyway, we've found that word of mouth is the most effective way; we simply let friends and associates, former colleagues and whatnot know that we're looking for X.
This is a hundred times more effective than LinkedIn for vetting candidates - people are quite unlikely to uncritically recommend someone when they will be reminded of their sell-in for years if it is a dud. (Much unlike LinkedIn endorsements...)
It turns out with friends&associates, friends&associates' friends&associates &c, you can cast a quite wide net - and also, the sell-in works better both ways; the candidates who do show up for interviews already have been told ours is a good place to be and are, more often than not, a good cultural fit.
(And, before someone asks - 'cultural fit' means 'Happy to work in a rather unstructured madhouse where the unofficial motto is 'We've never done that before, so we're probably quite good at it!') - we've assembled a motley crew from just about every nook and cranny of the planet, from Sri Lanka via Belarus to Argentina and Japan and lots inbetween. Oh, and the occasional Norwegian. All making world-class subsea equipment on a small islet way out in the boonies.
I am asking because that reflects my situation and I am having a difficult time interviewing with most people expecting 3+ year exclusively in frontend.
I have been trying to make a switch from backend to frontend development. I went from Backend Dev -> Fullstack Dev and I am currently trying to do the next step to -> Frontend Dev.
Would be nice to know how to approach this.
The in-line editor is a bit intrusive (fills up most of my screen, unlike say eloquentjavascript.net) but it's still pretty neat to have run-able examples. Kudos to the creators.
A
false != x
test failed for a zero-valued x; had to make it !==. WTF? I never want false and 0 to be other than different objects.Almost every twist and turn in this language is an imbecillic clusterfuck.
I had one instance of a if (foo.bar = 0) typo; no warning from the implementation. Why do we want stupid C mistakes in a higher level language, without the C fixes for them?
list.forEach(function (item, i) {
...
});
makes my eyes bleed. JavasSript borrows the syntax of languages geared toward a form of computing at which JavaScript is poorly suited for; when you're combining functions together, it looks like dog's breakfast.To get a value out of a switch statement, you have to wrap it in a function that is immediately called?
function () {
switch (WTF) {
}
}();
the switch statement has the idiotic break with fallthrough found in C.One redeeming feature: A || B || C ... works a lot like (or A B C ...).
Unfortunately, this is required for the simple task of incrementing a nonexistent dictionary key from zero:
dict[key] = (dict[key] || 0) + 1;
this calls for two dictionary key lookups. You want this sort of thing in a single operation.Oops! In the following, j isn't lexical:
for (let i = 0, j = 0; ....
I copy and pasted something like this from a StackOveflow answer into a recursive function and spotted that the j in a recursed frame was messing with the j in outer frames, there just being one j.What is "function scope" and why even have something so idiotic? Just let, or GTFO! C has function scope for goto labels, that's it; why introduce something like that.
Appending together Lists has functional semantics, like Lisp:
a.concatenate(b) // new thing is returned, a stays the same, so you must do a = a.concatenate(b).
But a.push(b) // mutates a in place.
Here is a shitshow, curently with a fitting number of upvotes: 666.https://stackoverflow.com/questions/881085/count-the-number-...
I accidentally wrote
if (foo.bar.indexOf[key] < 0) { code }
code was silently skipped even though foo.bar is an empty list. No diagnostic, nothing. Oh, indexOf is a function, which is an object. Every damned object is a dictionary with properties you can access as strings with square bracket indexing, and that is always safe: it yields undefined if the property is not found.
If all you need is time tracking, Kimai2 and several others will do the job just fine. But I've found in my line of work that it's useful to be able to produce formal quotes and invoices for tracking purposes. Ninja lets you do all of that, no extensions or modules required, and all of the components are integrated with each other (quotes can be converted to invoices, projects, or both, invoicing can be done by task or by project, expenses can be included in invoices, etc.) and it also features a very nice automated emailing system for client invoice/quote notifications and even a guest frontend for them to log into.
So all in all, I've found InvoiceNinja to be extremely useful and can't recommend it enough.