1,169 karma · joined January 31, 2011
Seriously though, how out-of-touch do you have to be to think that entire organizations full of smart people are so incompetent as to have 100% bloat?
Could you lay off 50% of Google today and still have a functional, competitive product tomorrow? Yes.
Would you still have a functional, competitive product in 2 years? No.
Engineers are building and maintaining the product, SREs are keeping the jobs, servers and infrastructure humming, sales is bringing in new clients and keep existing clients happy, marketing is... OK maybe Google does need a marketing overhaul...Deep cuts will also signal to employees and competitors that blood is in the water. Any remaining loyalty would evaporate and MSFT, AAPL, AMZN, & META would all be eager to scoop up that talent to build competing products to Google Search & Ads and bolster their cloud & AI offerings.
Disclosure: Google employee
It looks like you using Flutter's Dart<=>JSON serialization; do you recommend using built_value for immutable data structures?
Do you support protobuf/cap'n'proto?
1) Attack Submarines (e.g. Los Angeles-class & Virginia-class for USN) which usually roam within a designated operations area, surveilling, tracking, and generally keeping tabs on other nations' surface & sub-surface fleet dispositions. These subs typically have multi-week sorties and may intermittently surface for surveillance & comms.
2) Ballistic Missile Submarines aka "Boomers" (e.g. Ohio-class for USN) which are given a strategic area in which to operate and their objective is to remain silent & undetected, waiting for the hopefully-never-coming order to launch their SLBMs. These subs usually have multi-month sorties and often don't surface until the end of their patrol.
[0] https://www.wealthfront.com/blog/why-is-wealthfront-cash-acc...
[0]: https://ui.com/camera-security [1]: https://store.ui.com/collections/unifi-protect-cameras/produ... [2]: https://store.ui.com/collections/unifi-protect/products/unif...
1) This is solved by 2 interlocking concepts: comprehensive tests & pre-submit checks of those tests. Upgrading a version shouldn’t break anything because any breaking changes should be dealt with in the same change as the version bump.
2) Google’s monorepo allows for visibility restrictions and publicly-visible build targets are not common & reserved for truly public interfaces & packages.
3) “Code churn” is a very uncharitable description of day-to-day maintenance of an active codebase.
Google has invested heavily in infrastructural systems to facilitate the maintenance and execution of tests & code at scale. Monorepos are an organizational design choice which may not work for other teams. It does work at Google.
While it is used primarily in cave diving because it is more streamlined and less likely to collide with cave ceilings and features, I find it also quite comfortable for recreational dives with a pair of AL40s.
It’s also a fun conversation starter with other divers who are curious about my gear!
[0]: https://en.wikipedia.org/wiki/Federal-Aid_Highway_Act_of_195...
Skia powers Google Chrome[2], Flutter, & Fuchia[3].
[0]: https://skia.org/docs/user/modules/skottie/ [1]: https://skottie.skia.org/ [2]: https://skia.org/ [3]: https://skia.org/docs/dev/flutter/
Full disclosure: Google employee, working on nothing to do with Waymo.
[0]: https://blog.waymo.com/2020/09/the-waymo-drivers-training-re... [1]: https://www.wired.com/story/google-waymo-self-driving-car-ca...
[0]: https://vitess.io/
Google has all the building blocks for great backend services and front-end development and, if you know where to look and have some experience with them, you can build a rock-solid product in <6mos, also assuming you have a team that can execute and the political will to ship it.
Politics/consensus building is where the real roadblocks lie in Google, and presumably other large companies. Trying to make high-level product & technical decisions when you have 10 stakeholders with 3 VPs, all in different orgs, is serious exercise in patience; months of emails & meetings await you.
extension NullableExtensions<T> on T? {
R? map<R>(R Function(T) transform) => this == null ? null : transform(this!);
}
V Function(V) compose<V>(Iterable<V Function(V)> functions) =>
functions.reduce((composedFunction, function) {
return (V value) => composedFunction(function(value));
});
num add3(num val) => val + 3;
num multiplyBy10(num val) => val * 10;
num subtract5(num val) => val - 5;
final doABunchOfMath = compose([add3, subtract5, multiplyBy10]);
final optionallyDoABunchOfMath = (num? value) => value.map(doABunchOfMath);
doABunchOfMath(10); // 98
optionallyDoABunchOfMath(10); // 98
optionallyDoABunchOfMath(null); // null
The nullable syntax (${Type}?) also makes it clear to readers that this is a type which may or may not contain a value. If you don't supply the trailing '?', Dart will enforce that the value must exist at compile-time and you can write your functions without worrying about nulls sneaking in where they're unwanted.In effect, int? is almost nearly Option<int>, except you cannot represent Option<Option<int>> with Dart's nullable syntax.
Check out https://nullsafety.dartpad.dev/ to play around with the possibilities!