The head of the
Ecwid development department,
Vasily Vasilkov, wrote about how candidates make test assignments and what comes of it. It turned out funny. We publish the note word for word.
***
I will tell the story of one test task. A bit long, but hopefully interesting.
')
At Ecwid, all the test tasks for engineers are laid out openly on GitHub right here -
github.com/Ecwid/new-job . You can just start doing any task you like, without warning anyone, and then, when you are happy with the result, share it with me.
One of the first tasks I came up with was a console file rover using HTTP. It is very simple and I invented it with just such a thought. Suppose, I argued,
until such a simple one hangs, and then, of course, I will add some cool tasks. Then I will invent what! I will lay out such cool test ones, that everyone will gasp and immediately run to do them, and I will hide this primitive rocking chair somewhere and won't show it to anyone else. Somehow I thought so.
The rocker needs to be done really very primitive. Judge for yourself - you give him a list of links in a text file, and he downloads these files and puts them in the specified folder on the local disk. Must be able to download several files simultaneously (in several streams, for example, 3 streams) and withstand the specified limit on download speed, for example, 500 kilobytes per second. Everything.
To work with HTTP, you do not need to invent anything, you can take any library. To limit the speed - the library. To download in multiple threads, even the library is not needed - everything is in the standard Java library. You can, of course, invent and write all this yourself on your knee, but not necessarily. In fact, you need to take a few "cubes" and carefully fold them into the correct figure, applying a little programming.
This assignment will be three years old.
Over the years I became the owner of an invaluable collection of rockers of all colors and sizes. If life forces me to download something in several streams via HTTP - I am calm as a boa, I have more than a hundred solutions for every taste.
It is no wonder that this task, the simplest and most understandable, is made by the majority of candidates. Over the past years, this test has so enriched me with new experience that I can no longer write it off to the archive, replacing it with steeper and more fashionable tasks.
If another 100 console rockers will be sent to me now, I can say with certainty that it will not work there:- Some of the submitted works simply will not compile. Yes, works will be in compiled Java / Kotlin languages, but will not be compiled. The local IT is a form of wave-particle duality, as I understand this phenomenon. Of course, I am a little familiar with the languages ​​in which I ask you to do a test and, without any pride, personally add in the pieces that the candidate had in mind, but did not write, leaving me the opportunity for creativity. Usually this is the most interesting work. It's nice that the candidate is serious about the future place of work and not only gives you the opportunity to test his knowledge, but also, in turn, checks yours.
- Part of the submitted works will withstand the speed of the jumps with a very wide variation from the desired. For example, you want to download at a speed of 300KB / s, and the program downloads about 2MB / s. The difference is only six times, but strictly 2 megabytes per second and no more. As one candidate said, “the speed is maintained in a certain range here and there.” I really liked about the "some interval" and about the "back and forth." Now I myself try to use this turnover as often as possible - “We will make this feature in twenty days, five days back and forth.”
- Parallel download. On the one hand, I often think to remove this requirement, because according to it one can guess the age of the candidate, and I don’t like to do that. If you receive a letter with the question “In several streams is it like ReGet?”, Then you immediately understand that the candidate is hardly much younger than you and remembers the times of modems. I also remember all these endless ReGet, FlashGet, Download Master and the rest of my heart-friendly Internet bastards of the late nineties and the beginning of the two thousandths. No, you need to download not one file in several streams, but stupidly several files at the same time.
However, on the other hand, this requirement gives an inexhaustible source of pleasure when checking assignments:* For example, I want to download in 3 threads, and the program downloads in 4. I ask 5 threads - does the program download in 6. WTF? How can you make a bug? I go to the source and find the comment "Increase the number of threads requested by the user by one so that it swings even faster." Fuck argue.
* Another example is that the candidate writes: “The program can download files in N streams, however, cases of N more than one are not yet supported.” The phrase is all beautiful to the last point. While reading the scrub earwash, I wondered at the human agility, recalled the joke about mathematics and the chamber orchestra.
An infinite number of simply interesting solutions from extraordinary people:* As you, for example, such a solution - the task just figured out what size files with what speed you need to download, divided the size into speed and fell asleep by the resulting number of seconds. I even, somewhere deep in my soul, I find this solution logical - the program should work NN seconds, does it work, what did you find out ?! Apparently, the candidate did not expect that the reviewer would simply take and look (how cunning!) That the program actually pumped up. Very tricky decision, very.
* And here's another, apparently, a very stupid person who sent one class with an empty main-function (and nothing more) and explained, “This is how I plan to do this task in this style. I hope my thought is already clear? ”
I made serious efforts to consider this file on five lines, but, not having achieved the clarity of the file, I asked the candidate to expand the idea wider. I am waiting for the second year, without losing hope, however.
* I remember a wonderful person who wrote that downloading files via HTTP is a completely simple task and can he not do it? I answered in the spirit that, of course, you can not do and we parted friends. I didn’t hear or see him again. The man simply asked me in a letter if he could not do something, for my part, I did not find the strength to forbid him to do this. Everything. I hope my answer helped a person achieve nirvana and he still doesn’t do anything.
* Wonderful candidate, who said that he does not know Java and can it be done on Go? I said in the sense that “fuck it, let's go”, to which I received the answer - “excellent, I don’t know Go either, so I’ll learn and do it”! To be honest, I am proud of the acquaintance (albeit with a hat) with such a stubborn person.
The most interesting incident happened to me in Penza (SECON, hello!) At night on the street after the after-party. Night, the street, almost no people, I'm standing and waiting for a taxi to go to the hotel. Suddenly, from somewhere out of the dark, a person comes up to me and says: “Vasily, I tried to get an job at Ecwid, you refused me and since then I really want to meet you personally !!”.
I find it difficult to retell what thoughts flashed through my mind in those seconds. Dude, if you read these lines - thanks for the experience, no one has yet run up to me in the night with such ambiguous wording.
Actually, I wanted to say two serious things with this frivolous story:
1) Dear candidates.
You are ruined by the reluctance to throw away the work done and start over. For example, you started doing a task, but in the end you suddenly found out that you forgot to fasten multithreading. You are in a panic start to insert concurrency-crutches in your code, not intended for this. Don't do that. The most correct way is to throw away everything written and write from scratch, taking into account the missing requirements. Seriously. This is not a production code, there is no place for crutches.
2) It might have seemed that I was somehow not serious about the candidates and their test tasks. This is absolutely not true. I check every job sent with great curiosity and pleasure.
Virtually every scanned task gives a new experience, I find out something that I did not know before. Make the test task more, do it more often and send it to me.
Ecwid is always in search of developers. Right now too. We have a large non-legacy project, a geographically distributed cluster, serious workload, a smart team and high responsibility. In general, it is not easy, but interesting. The main stack is Java / Kotlin, but ReactNative specialists are also very much needed.
We are looking for developers of almost any level from junior and higher (Ulyanovsk, Samara). Do not be shy, do not think “will I come up?”, You just have to do a test task or, if you want, talk to me first, and only then do a test one. And they can do a test and do not have to, it depends on how you talk.
Our stack in the form of incomprehensible words and abbreviations - Java, Kotlin, PostgreSQL, Cassandra, Redis, AWS, Consul, Docker, microservices. Well, still full of all.
For any questions, write in the comments or on join@ecwid.com