797 karma · joined January 31, 2012
https://www.linkedin.com/in/avikdas1990/
You're right: if you don't control the server, you basically can't intercept any requests without this extra AJAX call, or some similar mechanism like a tracking image served from your own server. Essentially, you need to make a request to your own server at some point!
The architecture is pretty simple:
1. Insert the AJAX request into each page, sending the page URL and the referrer in the payload. Because I found some weirdness with tools like Pocket serving my pages from some cached location, I use my static site generator (Jekyll) to embed the page URL into each page, instead of pulling it from the client side.
2. I support multi-tenancy on a single tracking server by using multiple domain names. Based on the incoming domain name, I have nginx attach an additional header to the request that says which site is being tracked. This way, I can have my personal blog and my newsletter website both tracked by the same tracking server instance.
3. Then, it's just a matter of storing the data (page URL, time of visit, referrer domain, which site) into a SQLite database.
4. And of course, I have a small web UI to view the data.
Note that I don't do anything with the IP address of the visitor. That's personal data that I don't track.
I usually open source my code, I just haven't gotten around to it for this one in particular. Might be worth doing if people are interested.
The multiplayer aspect is immensely valuable. Having multiple developers walk around the same codebase together, discussing the architecture and the code, is helpful for debugging, onboarding, brainstorming, all the different ways we collaborate as developers. This kind of visualization is not a solo activity, so I can see where Vircadia would come in.
This is the part that I disagree with. The source code is linear, sure, but the structure that ties the different components in a codebase together is high-dimensional. For example, the symbol usage graph is really useful to visualize in 3D, as is the general package structure.
And most of these visualizations we see don't even touch on runtime analysis like I was working on! There, seeing different types of data arranged either by where the data is coming from in the source code or where the data is coming from at runtime (analogous to lexical vs. dynamic scoping) is a visualization that benefits from 3D.
One part we struggled with was evolving the visualization with the codebase. I see in the demos at the bottom that small changes to the codebase can have a large impact on the visualization (unless I'm missing something), making it difficult to treat the visualization as a fingerprint over time. I wonder if there are plans to address this.
This is an area I'm very interested in, happy to chat about it any time.
I don't know how convincing that argument is, but hopefully realizing how much investment the big tech companies are putting into their talent is eye-opening for some people.
(Note: I talked about investing in junior employees, but the idea applies to all your employees.)
[0] https://hiringfor.tech/2020/09/07/the-prisoners-dilemma-of-t...
The topic of what to ask at the end is one I floated around, but I didn't find it to be a priority. In an ideal world, the questions at the end wouldn't be part of the evaluation anyway, so it should be a time for you to ask whatever you want. Unfortunately, I'm sure interviewers do judge based on those questions, so if anyone has insight into what "good" questions are, I'd love to know.
This has been my gut feeling for a long time, and in the last year, I finally took the time to write down my thoughts on the topic. Every week since February 2020, I wrote about some aspect of interviewing that could be improved [0], and I now feel confident there are actionable improvements to be made.
Individually, we as interviewers can shift our mindset towards looking for strengths instead of weaknesses, accommodate different backgrounds, acknowledge the best developers are not the best interviewers (both as candidates and interviewers), and put in the extra effort to hone our interview skills. At an organizational level, I'm working on training material that I hope to promote within companies that are interested in improving their hiring process.
Interviewing is thoroughly broken. But I have some ideas to make it better.
- Is the interviewer looking for syntactically correct code, or general algorithmic skills?
- For a warmup, is the interviewer looking for a basic solution, or an optimal solution?
- For architecture walkthroughs, what level of detail is expected?
The extra pressure is definitely unnecessary.
[0] https://hiringfor.tech/2020/03/02/are-you-asking-candidates-...
Instead, the goal should be to ensure _qualified_ candidates can demonstrate the strengths they have in meeting your requirements.
So basically, there are two pieces to looking for strengths:
1. Determine which requirements truly matter. Even for highly technical jobs, interview skills are not what makes a successful employee.
2. Find ways for those who meet the bar to demonstrate that fact.
I've spend this year writing about hiring[0], both to talk about the problems and provide suggestions on how to improve the process. My suggestions are sometimes high-level, and sometimes very detailed. Some examples:
- Be specific about the requirements [1]
- Tailor the requirements to the role you're hiring for [2]
- The types of non-technical issues that can cause a candidate to perform poorly, and how interviewers should correct for them [3]
- Let people work independently [4]
But above all, my primary thesis is that it comes down to looking for strengths, not trying to discover weaknesses [5]. Having been on the hiring side, this is the specific suggestion that I believe will have the most impact, especially to those who want to land a job that would have been out of reach otherwise.
[1] https://hiringfor.tech/2020/03/02/are-you-asking-candidates-...
[2] https://hiringfor.tech/2020/06/22/hiring-for-the-role.html
[3] https://hiringfor.tech/2020/05/25/letting-the-little-things-...
[4] https://hiringfor.tech/2020/08/03/reducing-interview-stress-...
[5] https://hiringfor.tech/2020/02/10/false-positives-and-false-...
However, children of immigrants are especially keen to assimilate into the receiving culture, so much so that they often go beyond what natives do. For immigrants and their children, a clash of cultural values may be a larger driving factor than what's the natural for people in general.
You can find all my past articles[1], and I'm happy to find you specific ones. I think, given that you can't switch away from algorithmic interviews, at least make the interviews more collaborative, define your expectations up front, and generally find ways to help the candidate show their strengths.
[0] https://hiringfor.tech/2020/02/10/false-positives-and-false-...
That only works if all the functions you care about are in one codebase. If not, then the changes the article talks about become backwards incompatible changes in your library.
> So I guess these are not real problems.
If you're designing a library, the approach you take determines what types of additions are breaking changes and which are not.
And by extension, different places include ones you don't own, and therefore can't change. For example, say you have an interface in your library that consumers of that library implement. If you want to add an operation to that interface, all consumers of your library, ones you don't even know about, have to support that operation.
But, if you want to add a new interface, consumers only have to implement that interface if they want to use functionality based around that new interface.
(And of course, the same applies in the opposite direction if you're using an operation-first approach.)
And even with "point" light sources and the parallelized light patterns, the whole scanning takes a while:
> This image is 578x680 pixels and was acquired in a little over 2 hours.
The swapped image has the same resolution as the projector, so it seems yes, you'd get a very low resolution image if you used a large light source like the sun. You can see this in the "Accidental Pinhole" supplemental video. The reconstructed image is very low resolution, but the quality is slightly better when the light comes in via a smaller area (a mostly closed window).
I don't mind organizing the code. I just want the barebones in the beginning. I see that WebGL fundamentals, for example, uses a webgl-utils library, which is what tripped me up, even though it's only used for one small utility.
Basically, I'm still on Chapter 0 :)
As another commenter asked: what does "DSA-like helpers" mean in this case?
Most of my writing can be found at my blog (https://avikdas.com/), but here are some from the same dynamic programming series:
- Deep-dive into the Chain Matrix Multiplication Problem - https://avikdas.com/2019/04/25/dynamic-programming-deep-dive... - Real-world applications of DP: https://avikdas.com/2019/05/14/real-world-dynamic-programmin... and https://avikdas.com/2019/07/29/improved-seam-carving-with-fo... - Another real-world application, this time in machine learning - https://avikdas.com/2019/06/24/dynamic-programming-for-machi...
If you look on my blog, you'll also see my recent series is on scalability, things like read-after-write consistency and queues for reliability.
The follow-up posts go into even more detail on individual problems that can be solved using either form of dynamic programming, including some real-world problems like content-aware image resizing.