Thanks!
1,053 karma · joined December 6, 2010
South African temporarily in the Bay Area 2011-2015, Seattle 2016-.
Formerly tech lead and first employees at startups Yola (2007-2010) and KnowledgeTree (2004-2006).
Contacting/following me:
fb.me/nbm @nxsy on twitter Email: HN username at nxsy dot org
Thanks!
Documentation costs productivity to write, but when there are many people who would be made more productive from it, it makes sense to do it.
I think "slack" is the right way to think about it. It isn't a free-for-all - the business still needs to run - but there's enough space to explore, to rewrite, to document, to polish, and so forth. That's where the magic happens - the unplanned and the unexpected things around that which you thought you were going to do.
I don't think anyone is "avoiding" any work - there's just tons of work that needs to get done, and people mostly choose to work on that stuff that interests them. One could say that product engineers "avoid" infrastructure work and infrastructure engineers "avoid" product, but I think that would be inaccurate in most cases.
I think the key is that these projects actually provide value - they make things faster, more reliable, more scalable - whether that's the code's execution or the people writing the code (or debugging issues, or whatever).
They generally aren't solutions seeking problems - they are responses to problems that exist.
Engineers generally don't build things like this on the weekend - unless they like to structure their time like that, I guess. It may or may not be a full-time job, but the job whatever it is isn't some search for abstract perfection, it is again to solve real problems encountered by others in the company. Often it is a part-time component built as part of trying to solve some more direct goal - like fighting spam, or serving bits, or whatever.
Often it is something the engineers just do - it makes sense to break things up into libraries, or services, or whatever, and they do that, and then that library or service is usable/useful elsewhere, and that's it. Other times they may suggest and motivate it as a goal-in-itself in a team goal setting situation.
I doubt that's a particularly useful answer, but maybe with further questions I can make it more useful to you?
I don't think there's been any policy changes. I think the policy has always been that we're open to open sourcing stuff, so long as it is useful to others (ie, not just a code drop that nobody can use) and someone signs up for the work and there isn't something important that's being dropped in the process.
The difference I think is people, energy, and momentum.
We've been able to find people (many already at the company) genuinely interested in some of the less glamorous parts of building a scalable program to open source things - things like sync processes and pull request management and UIs for ACLs and CLAs and so forth.
We've had people who, often due to the availability of these tools, have developed an internal energy to want to put in the extra effort to make their project ready to be open sourced (like making sure all dependencies are available already, or scoping out or stubbing out things that are Facebook-specific (our asset management flow, for example) while still keeping the software useful, and so forth.
The momentum has also made the idea of open sourcing code more top-of-mind to people, which helps to get people to rewrite their changes to accommodate a nascent open sourcing effort on a piece of code, or to get more discretionary time to investigate or work on making something open source. Or even just moral support from your team and colleagues.
I don't know the actual strategy (I work in a nearby team, but my focus is mostly on load balancing and CDN infrastructure), but one could imagine that in future it may be more normal to augment existing clusters/failure domains (say, add one pod) rather than building whole new ones.
Apache Traffic Server only got SPDY support in a release about 45 days ago according to their release notes.
There are many other relatively basic features besides those, and similar considerations exist for the other projects that existed back then (and even now).
Also the previous load balancers had constraints we weren't willing to accept - they required special connectivity to our networks, we could not use particular combinations of options, and we had to rely on vendors to solve problems that most of their customers were not encountering and/or able to detect.
A lot of that data is also not tied to individuals either - for example the access logs for the CDN (which, being on a different domain by design, does not share cookies so is not attached to an account) even reasonably heavily sampled is probably tens of gigabytes a day, and is rolled up into efficient forms for queries in various ways. A lot of it isn't even about requests coming through the web site/API - it may just be internal inter-service request information, or inter-datacenter flow analysis, or per-machine service metrics ("Oh, look, process A on machines B through E went from 2GB resident to 24GB in 30 seconds a few seconds before the problem manifested").
(Not that it makes too much of a difference at this scale, but it is closer to 860M daily actives.)
So, when you add a comment, TAO updates its internal structures with the new comment in the right place (after the DB is updated), and there are no "keys" that need to be updated beyond that.
The majority of core information (attributes of people and places and pages and so forth, as well as posts and comments) is stored in MySQL and queried through TAO.
Some data is primary stored in things like HBase, such as messages.
Non-primary-storage data (indexes and so forth) exist in various forms optimised for different workloads - so data in either MySQL or HBase might also exist in Hive for data warehouse queries, or in Unicorn for really fast search-style queries.
Other data (such as logs) might reside in one or more of the various data stores, such as Scuba, Hive, HBase, and accessible via Presto, for example.
TAO: https://www.facebook.com/publications/507347362668177/
Unicorn: https://www.facebook.com/publications/219621248185635
Hive: https://www.facebook.com/publications/374595109278618/
Scuba: https://www.facebook.com/publications/148418812023978/
Hope that makes sense - let me know if not.
(I work on the team that builds and runs the Facebook CDN infrastructure.)
/d111/f857.d(9): Error: pure function 'f857.foo' cannot call impure function 'f857.modify_global'There's Bootcamp, primarily for New Hires, but which anyone can go to if they like. I teach a class there about how our Traffic management works - load balancers, and so forth.
There's also classes about learning to program on iOS or Android (those are generally a week long), or on Haskell or C++ or D (these are generally a few hours a week for a few weeks), and smaller ad-hoc 1-4 hour classes on things like the data pipeline tools, debugging and performance tools, and so forth.
There are also ad-hoc "Tech Talks" which just discuss general topics without a specific "learning" focus.
And then there are non-technology but career-oriented courses about time management, technical leadership, managing your manager, how to give good feedback, how to have difficult conversations, and so forth.
Older people tend to have more job experience. Not even starting the interview process on someone because they have a lot of experience, means not starting the interview process for older people, which is ageism.
Rather make the offer if they earn it, even if it isn't in the range the person might seem to want. It's up to them to decide to accept it or not.
I get "Staff Engineer" (some seniority indicator, which we don't have at Facebook on purpose), but "Architect" seems more like a change in role and in expectations rather than advancing on your existing path.
There are a few flavours of seniority for ICs - deep domain expertise, deep skill set, high productivity, high flexibility, able to design and communicate and drive large-scale changes, mentorship, and non-technical organisational leadership like running a training programme, improving hiring, and so forth.
Might be worth interviewing or just chatting around at a bunch of different places (big companies, startups) and see whether something grabs your interest. Passion is often a bit contagious.
I've been pretty happy changing teams every year or so at Facebook, so also consider whether your employer has any internal transfer options available.
Focusing on #4:
If you don't think you have people to learn from in your team or sufficiently close to you in your company, you should move - either within the company or without.
If your company doesn't offer an IC-only track, you probably should make a move elsewhere.
#1 - you'll only really find out about comp once you've got an offer (and then negotiated on it), so you'll need to get out there.
#2 - Tell your manager what is eating up your work time on things you don't enjoy. If they can't make a difference on that, look around. And also just opt out of things. Also might be useful to be more clear here on what is eating up your time.
I've worked on at least four teams since I joined (and a few smaller projects) - ranging from spam fighting systems, search infrastructure, internal infrastructure management systems, and now on the CDN team.
Your recruiter can do the same thing, of course.
My personal advice:
You control how much time you spend at work and doing work at home. I've gone through periods of being very careful of not doing more than ~40 hours a week of work, and also taking advantage of the ability to work from home some of the time. I've also gone through periods of doing much more than that, because I chose to. I am confident I would not be looked upon differently not having done so.
When you choose your team after Bootcamp, make sure you are clear with your manager on how you want to work. (Feel free to reach out to me after you start - my unixname is nbm.)
This two-stage process also allows for good health checking from the much-simpler Linux ipvs L4 load balancer servers to the more-complicated L7 load balancer servers.
This was described in this Velocity 2013 talk - http://velocityconf.com/velocity2013/public/schedule/detail/...
First the numerous C++ and Java backend services that do most of the heavy lifting like producing the feed, doing searches (of various types, both from what people type in, and internal ones), sending and receiving messages, spam and fake account detection, &c. The PHP portion acts as a front-end to these services.
TAO is the graph caching system that has largely replaced memcache at Facebook.
Just on the traffic side, there is the global traffic management system (for dynamic and for static content), different types of load balancers, CDN-specific caching software, image and video transcoding/encoding, &c.
And that's just the stuff involved in the production path - there are all sorts of behind-the-scenes things that do async work of various types - either as soon as possible (video encoding, updating) or on a daily or whatever cadence to update infrequently-changing things.