Friday, May 21, 2021

First month and closing up

First month. Still no luck. The initial theory of splitting up the challenges seems to be working ok. I will have to make some adjustments since the last take back home took me two consecutive days. Interestingly enough, I've found an excellent book to read that has a more down to earth intro to Big O, Cover image for A Common-Sense Guide to Data Structures and Algorithms, Second Edition, 2nd Edition. It's easier to read than Sedgewick Algorithms since the latter focuses more on the math side. If you don't have a background there, it's terse and almost impossible to figure out. Now, regarding interviews, what I figured out to say is. The second most important thing, clear up from the beginning which languages you have been working with and that I am not a full-stack developer. The following are just two cases, but both of them pissed me off completely. Last Tuesday, I had an interview with a person that is in Japan. I had to wake up really early. The company that contacted me via angel didn't have any info about the company. All I knew was that it was a `blockchain` company, and that is all. Due to the sheer amount of interviews I've got, I don't have time to read every single one and get briefed during the interview. The dude complained due to my resume and didn't like it due to my trajectory. On my homepage, you can download my resume if you are intrigued. Besides that, he tried to pigeonhole me into a trainee position. He stated several times that training me will be a waste of time (literal). I don't have to explain how pissed off I got since I was doing a challenge. I put it out on hold for this idiot to be told that. There are a lot of amateur interviewers that consume your time. Hold on to this, though. I've got another example to give. Yesterday, Thursday, I had the second technical interview for a company that I asked to have the challenge a week later. The challenge itself, as I mentioned, took me 2 days full at most. It had an abstract question about a pseudolanguage that used some signals and boolean events to run functions. The idea was to "create" a function that finds the exact divisors of a given number. I provided him with a classical linear solution since I wasn't sure exactly if the language worked how it works. The challenge did not ask for optimized solutions. The challenge was to write a Flask API that receives a command. Stores it in MongoDB, returns the id, and uses that id to delegate to a background job that executes the command, stores the output in mongo. Then you had to create another endpoint that will receive that same Id, and print the output. I provided my usual template, unit tests. This Thursday, they contact me to have a second-round between that Thursday and today, both outside of regular business hours. Scheduled for Thursday at 18 Argentina and interview starts with two interviewers. One didn't talk, and the other asked the question (I'm aware that I'm not a native English speaker, but boy, it was tough to understand him.) They didn't read the README or even run my code. They didn't even read the pseudolanguage solution. Complained during the first half-hour of my resume of my experience. Proposed abstract scenarios that didn't like the provided answers. He didn't guide me or tell me anything, just wasted my time and complained. Even when I answered a question that permitted some development in his abstract world, he was so busy complained how bad it was my answer that he didn't hear something that later I googled and was one of the proposed solutions. Didn't guide the interview, just complained about answers when they were not correct. A typical pattern is that they complain about my short-lived positions. I don't know why they schedule a call to complain about that. But the worst is the one that sends me the challenge, puts a second interview, to spend half an hour complaining about my jobs. After I wrote this and was in a sequence of interviews, I got a contract with a staff augmentation company. I'm starting in two weeks wich a much better rate than I've ever had in my life.

Tuesday, May 11, 2021

First month

 

It has been a month so far.


What I've learned so far?


Don't put several interviews on the same day.

It's hard to track information as you are speaking with the interviewers. There is no room to think about the company and what your steps are ahead.


These interviews are long processes that are not paid

Don't accept "deadlines" you are not in a contract, you are not at work, they will not pay you this, no matter if this goes right or wrong.


Value your time, and don't put several challenges for the same week.

If they don't like that, that is their problem, you don't have to please them, they are not even paying you for this. If the company is really urged, they have to pay you for your time or simplify their process.

Maintain your mental health above all.

It is pretty easy to get demoralized after several failures.

After three weeks, I felt a complete and utter failure.

I started to spiral in anxiety, so I decided to do a complete stop.


Ask about how they manage the payment.

This will make more sense to people from Latin America. If you receive your payment in crypto, use an intermediary company like Bitwage, or have a foreign account, ask the interviewer if they will pay in any of those methods.

Don't spend time doing a challenge for a company that will flat-out refuse to pay you in your terms.

I was doing a screening for an Uruguayan company. They insisted that they were going to open an Uruguayan bank account for me.

Although I mentioned that I already have my preferred method, they simply ignored this.


There is no silver bullet.

It is a general recommendation that you have some sort of knowledge of a company before the interview.

I notably spent several hours researching what Storj was and what they offered.

As the end result, I didn't even reach the technical exam. I was screened out.

It is not a conclusive result, but this was pointless researching overall what did the company do. They had several solutions. I didn't have a clear vision of what I was going for, just that I had a company that offered several things and zero ideas on what to ask.

This experiment is the result of 1/33 companies. I've spent several hours researching.

The point is that the consumed time doing that took time out of doing technical preparation.


Ask how much time the feedback will take

The Spanish company started with an aggressive deadline of 1 week to complete (take into account that I do this challenge, I can't do others or interview other companies).


The code wasn't a lame CRUD. It had a level of complexity and research.


At 3 weeks now, the feedback is that "they liked it, is well organized and documented.", but still, I've got another technical challenge ahead.


The amount of time I dedicated to that really crippled me hard with other challenges I had, and then I didn't receive an answer for 3 weeks.

That is not good for me as an interviewed person.


If I don't have precise timing when the feedback is provided, I'm kicking those interviews for later weeks.


It is counter-productive to demand a deadline and then don't know when you are receiving feedback.


Embrace it. Companies will not tell you what went wrong

My test case is the company Polar. I've reached their fast process to the last instance.

I deduct that I did not pass the test because, after almost a month with no feedback, that means that I'm not their right person.

I sent an email a week after asking how it went, and I've never heard back from them.

Out of 33 companies, only "three" provided feedback about the process.

I use quotes because, technically, two of these were staff augmentation companies.

After resolving their interview, it didn't do anything for me because there is another phase where I will have another different and drastically different challenge.


If you have feedback, it may mean nothing.

> Jorge wanted to let you know that I'm moving forward with another candidate and don't think we are a good match. I enjoyed our time talking and working through some code. I think you have a bright future ahead and wish you the best. 


That is the only verbose output I had from a process.

Does it tell me how to improve?.

No.

Does it mentions what went wrong?.

No.


I don't know what a good match is. This was like when I was getting rejected by girls when I was inviting them out.

I'm not complaining about the interviewer. That is absolutely not the point.

At least I had a quick rejection notice, which is more than what other companies have done, but it is still nothing.


It is hard to read between the lines what they are looking for.


Some tech interviews are a blatant copy of the Cracking the code interview with runtime questions, such as run time complexity of a palindrome solution that I quickly created.


Others are subtle, like create a translator from decimal to English numeral or roman numeral and going over the code.


Some of them ask you questions like a robot and recall absolutely all the functions in the language you are evaluating. I tend to avoid wasting time on this.


If they don't read a manual, I'm not memorizing all the programming languages I know and recall every single function call.


Be calm

Don't act irrationally, take your time, study ahead of time, prepare challenges in hacker-rank or other tools.

Read cracking the code interview.

Don't feel bad. Even if you do all of these things, it most likely will go wrong.

You are not a bad developer. You've spent time doing this.

I decided to do a complete stop and start refactoring how I do challenges and how many.

At most, I'm thinking of doing a challenge per week.

It had a crippling effect to receive so many rejections in three weeks.

I'm starting to filter staff augmentation companies. These are sponges that add another technical barrier ahead of me.




I'll update this and mention how it went.

I started already to space out challenges. It may go wrong. Still, I'm trying this out, but the most essential part is that I want to have peace of mind and don't feel pressured by things that will never be paid.


And finally, an update on the stats.


Stats
Total
Rejected53315.15
Expired4
12.12
Declined13
39.39
Interviewing11
33.33

33
100.00

Wednesday, May 5, 2021

Third week is for anxiety

Monday 3 / Tuesday 4

Still no news.

The Spanish company still hasn't any kind of feedback. I shut down the live site.

I don't know why I've spent so much time doing that challenge.

The other company provided feedback, and I've got a second challenge tomorrow, Wednesday 5.

The second company I interviewed and had the `final` interview didn't even answer my email asking how the test went.

So I don't know if I've passed the interview or not.

The rest of my challenges are 90 minutes, 105 minutes, and I don't know what else.

There are a couple of staff augmentation companies going on, that to be fair, I'm doing them just in case I don't get any gig this time, but I'm not entirely convinced.

Thanks to a previous work partner, my other alternative would be to work in something different and have a technical manager position.

I don't know what will happen, it is a bit difficult to stay calm when I used to get jobs in no longer than two weeks.

I'm doing this on my own and to be frank, I'm a tad nervous, since I don't have any kind of support.

Wednesday 5

Finished the challenge with the Canadian Company, and it went wrong. I got the rejection letter at EOD.
I was nervous and tried to plan for anything, and it still went wrong.

After that, I had another challenge for a sort of shitty staff augmentation company in Argentina, which for the kind of Interview I had, I already know the output.

And then another crappy staff augmentation company with a dude that, to be fair, is the first time in my life that a person is asking me political questions during an interview.

Thursday 6


Since I can't sleep, I decided to update this blog. Today I will have 5 interviews, one feels like I just took it because I want to have bigger numbers in the overall percentage of interviews but I'm not even looking forward to work on that.

My stats so far, since February 17 until now.

Rejected3
Expired4
Declined2
Interviewing8

I was contacted by 15 companies without doing anything and applied to two companies.
Those are my results so far.
For the sake of results, I don't even know how to qualify Polar since they never answered me if the test was Ok or not ok, and the email asking for feedback didn't have any response, so I classified that as expired.

Friday, April 30, 2021

Two weeks

It has been two weeks since I have finished my contract.

I've got interviews each day.


My first week had a challenge for the Spanish company Lana, published here.


I delivered the project 2 days before the deadline and did not have any kind of feedback.


I contacted the recruiter and also did not had any kind of answer.


As I am writing this, I've requested further feedback.


I find it disgusting how I'm demanded a deadline to complete a challenge, and then I don't have any kind of feedback.


To make this worse, I was doing another Golang challenge for a Canadian company. I accept, and I receive a 24-hour deadline to complete a challenge, and that it should not take more than 4 hours.


I deliver in 4 hours 10 minutes.


They were going to review it at night, and then I would have a 90-minute extended test working in pairs.


No feedback.


I'm seriously thinking of starting to reject challenges and send them to the projects I've presented, or they can pay me to do the exam.

 

Sunday, April 18, 2021

Another hit and miss

 

Well, the Golang project is over.


In over fifteen years, this is the first time in my life I'm given the option to "switch languages or leave the company."


What happened.

As you know from my previous post, the company used rails / a mixed Nodejs / Typescript service and everything in Heroku.


The moment my team joined, the only developer lasted a couple of weeks, and he left.

What I didn't know is that I would be repeating his steps. 

I feel like I've been in a loop over these ten months.


With the original developer out, I felt that he was overworked, really severely overworked. He didn't know the entire application, but he knew the neuralgic points.


The stack of Heroku + Shopify / recharge had several weak points.


Recharge

Well, it is awful. From time to time, we had to fix bugs in Shopify without even changing the code because customers would not see the payment done. However, we had not changed anything at all.


Usually, e-mails to Recharge take time to receive feedback.


I don't recall if the company was paying enough to receive better support, but I don't think that the answers were ok.

To give a better example, Recharge operates with API keys, like aws, for instance, and they have a quota.

The first time I contacted them, they provided me with the consumed data information.

The second time I contacted them for a similar issue a couple of months later, the support person didn't want me to provide that information.


Shopify

I guess that e-commerce is an alien world for me. I've never done it, and this is my first time.

During that time in that company, there were several conversations about e-commerce applications that started and were a complete failure, others not, like Shopify.

I see the appeal for mom-and-dad shops, fancy small fashion design studios.

There are "risky" points like setting up a domain, but you can delegate that to the Shopify team for a fee.


What Shopify managed terribly wrong were the platform API changes.

They have a versioning system that lets you know that you have to update your version, but what they did was different.

They announced that by a specific date in January, the payment plugins like Recharge will stop working entirely. You have to manage payments differently.

We never found what the change was, and we had to rush as I've never done in my life.


Shipstation

Well, a standard JSON API with a rate limit.

That doesn't offer a sandbox. You need to contact the business on their end, put a credit card because there is no real sandbox, and if your test order get's delivered, you get a charge.

What I can say, I believe that is a "system without a sandbox" pretty much clarifies were you are standing. Other than that, there is nothing to say about them.

 

My ex-team and myself

Since I was never part of the decisions, I don't have explicit knowledge of what happened.

As far as I knew, the company understood that Shopify was screwing the pooch, they didn't provide good answers.

We were missing team members. We were going to rush and use Stripe.

The plan was to release the V2 version.

A V2 deployment in phases plan was done, and everyone was on board, and they all fully understood what we were doing.

We hit the first milestone somehow correctly. I interconnected the V1 site with the V2 react site via GCP cloud functions and redis.

My director of operations usually had the pattern that he siloes the information, so you are completely blind. Since we've had the same results for the third time, I believe that he doesn't correctly communicate with the client or hides information.

During Christmas and New Year, I've worked both days.

My qa partner had been missing since ever.

Apparently, we had to inform him that we worked in V2, although he was present for four months in the stand-up calls.

Apparently, it never crossed his mind that he should ask what we were doing or how he was supposed to test things.


But the best part came from my director of operations.


It was our fault (the developers, not him) that we didn't inform the QA.

Apparently, another of our tasks was to do the work for the QA, too, and tell him how to test things and that he should be ready for the unspecified release date.


We were still rushing. My other tech lead developer has a more full-stack mindset, so she thoroughly worked in the backend and coordinated the front-end team.


I created the whole backend dockerized environments for the developers, created the pipeline of all the services, front and back, created the pipeline step that backed up the DB before deploying.


We both stayed late for one month and a half to absorb the quotas of business logic that our director of operation released from time to time and unblock the team.

And all the things that I now entirely regret doing due to the ending of this adventure.


On February 12, the director of operations orders us to deploy V2.

We informed him, "this is not tested at all".


He said that he was being pressured by marketing because they had a huge budget to spend on ads and couldn't hold it any longer.


Due to his pedantic nature, he dismissed our assessment that the code wasn't tested and said that four days would be enough.


I don't have to expand on the dangers of releasing untested code to production. Still, oh boy, untested e-commerce is unnaturally insane.


The business logic that apparently nobody knows in that company wasn't completed. We had to manually fix records and work 12 hours sometimes to resolve issues.


The whole plan to have a controlled release crashed and burned, and nobody cares about that thing at all.



We burned ourselves (developers) trying to keep that thing afloat. I've never reached this level of stress and despair.


The director of operations left or was let go.


We observed that the company had been seeing other staff augmentation companies.


They assured us that they were just talking, and obviously, you know where this is going.


When they let go of the director of operations, they told us that the company may switch to Rails / Nodejs because e-commerce uses that and not Golang. 


The team members were really vocal about this change, and nobody wanted it to happen.


They made me convince my other tech lead partner to say (she was going to quit), so we resolve that, and we move forward. I deeply and entirely regret asking her to do that.


We were at three weeks of completing the automation of the system, and they agreed.


But it was terribly in vain.


One week in the development of the "last phase," and they ask us to switch to V1 because they want to be stable (despite V1 being the most unstable application).


Following that rollback week, they call us to a meeting, where we were told.

There is a new leader that will be the leader of you all.

We will code in rails, and if you don't like it, you can leave the company.


Damn.


That weekend my stress almost killed me.

I had orthostatic hypotension.

I fainted three times in the bathroom. I hit my head three different times really bad, and I think that I may have fissured my right elbow.


The end of a contract.

We reverted the company to V1 as they asked, and now I'm out of a job.

It seems that again I'm going to be without employment for a good couple of months.

I've got to take care of my health, study for interviews again.

But what hit me the most is the time that I spend sitting on this computer, rushing to complete something that I was pretty much entirely dismissed at all.

No questions asked, no nothing, they simply offer me to change the language or leave.


I've designed the architecture, coded channels to handle events, integrated third-party systems (Shipstation), and now all that is in the can.


All my time spent in that is never going to be back.


I've only touched the surface of Golang and GCP, which I guess is a pyrrhic victory for me.


I'm getting old, my mother is getting old, and all the time I did not spend with her is not coming back.


All the time I spend it trying to do the impossible, like when I was twenty-something for a company that didn't even ask me what I thought about the design change.


Again, like at the end of 2017, I'm on my own, alone.


Saturday, October 17, 2020

Moved to GCP and Golang

It has been awhile since I've written something.

I've left the real state company, the CFO that joined was a real piece of work.


I've spent a couple of months without a job, I've been moving with the same team for 3 years now.

During that pandemic vacation time, I've spent time playing with Gitlab, pipelines, React, Redux,Tornado in Python and Heroku.

We started a new contract that is a series a company that the core is in rails / typescript and shopify.

We are moving towards GCP / Golang / Shopify, but there is a long road ahead.

While we prepare for that, I've been playing around with hacker-rank exercises.

I've been using Golang as a sad excuse to use the language, because there is some road ahead before we start with the company to implement Golang.

There are certain things that since I've been working with Python since 2012 that feel different.

One simple thing, there is no way to determine the position of an array element in an array. You need to iterate the array to know the position.

This may sound trivial, but when you've got huge collections, like arrays of 9 thousand elements, it is going to be slow.

I've been focusing mostly in a really down to earth exercise, New Year Chaos.

I honestly love the problem, it is so simple, yet as soon as you've got more test cases, you promptly challenge your previous solution, since either it is too slow or it does not complete in the expected time.

I think that is really a great exercise.


Without further comment, we are two months before end of year and we haven't our baptism of fire with Golang, so I'm going to keep on fighting with that hacker rank problem in my spare time.

Thursday, November 21, 2019

Ecs, CircleCI, NLB and Grpc

I finished a migration from Heroku to ECS using CircleCI orbs for AWS.
I detail the aspect of the migration and the peculiarities of the project.

CircleCI

 

I knew of CircleCI back from 2016. I just knew that it was a more accessible tool to configure than Jenkins, and the project I was working on already had it.
Back then, I did not pay much attention to it since my main task was developing.
Cue to mid-2019, the company I'm working on switches from Jenkins to CircleCI. They did not want to spend resources, time, or anything. They want to "have it working without spending time fixing it.".
They move to CircleCI, and everything is working without the problems we had with Jenkins.
This new project I was working on was using Heroku with a bash script.
We opted to use ECS, and we found that we had support for it.
The documentation for the ECS orb is not clear at all if you don't spend time reading the terms of CircleCI orbs.
There is no clear differentiation between the job and the workflow, and I spent days confused.

ECS

 

I already talked about ECS, three years later and I'm back with it. Things are pretty much the same as before, now we've got fargate, that I have not used, but the documentation on crucial aspects like green/blue deployment is tailored towards that, which sucks, but is what it is.
Things are the same, you create a cluster, you create services, and you place tasks on it.
The new things I'm using this year are;
  1. Green/Blue deployment (soon).
  2. NLB for GRPC (more on it in the GRPC section).
What I do have to recommend is that if you are planning on expensive IO operations and you are planning on using "t2.small" as the best machine, then stay away from ECS. You are going to have downtime because the IO consumes the CPU credits fast.
We've got a situation with a monolithic application that we won't spend time refactoring. Still, the section of the code that works with PDF's has a lot of IO code, some parts are abusing IO due to the library they are using, and some parts abuse IO in the monolithic application itself.

Grpc

 

Again with GRPC. In the same situation, learn a bit more about how to debug the server internally, how to force the channel closure.
The "options" parameter for the server and the channel on the client receive a list of tuples. It lacks documentation in Python, and you need to dig deep into the source for figure how things work.
Options that you can use are also missing in Python, so I ended up reading Go examples that gave me an idea.

NLB

 

I'm writing this document on 11/21/19, NLB does indeed work with ECS EC2 deployment type without any problem.


The crux of the problem

 

I am using ECS (EC2) with a network load balancer to have the GRPC server working.
We are using internal NLB because we are not exposing GRPC to the outside world since this is just for our microservices.
The main problem is that the NLB balancer does not balance the machines behind it. Once the NLB opens a connection, it keeps on reusing it, no matter if you close the channel in the client.
That cascades the problem that If I create an autoscaling group because the EC2 instance serving is degrading, I don't have a way to force that without having downtime, which indeed it sucks.
In theory, GRPC also offers to balance at the client level, but since I'm doing a deployment in ECS, I don't have an excellent way to fix the IP of the server since the IP will change after the first deploy.
I don't know, and perhaps I could opt for a strategy like placing an elastic IP and find a way to articulate this in ECS?.

I will write my findings if I ever find a solution to this problem.

Sources and links used during this research.