58 karma · joined February 1, 2014
Also some engineers might not be great, but they are good at picking the right tools for the right job and as a result the whole company ends up doing well. I don't believe in 10x developers because sometimes small engineering decisions can have a disproportionally big impact on company success.
When discussing engineering problems with these individuals, I never had to explain twice - Often, I didn't even need to finish my explanation and they already knew the optimal solution for that problem.
These people are impressive to work with but I think it often comes down to experience more than intelligence (but they are usually very intelligent too). When an engineer has mastered a particular set of tools/languages/frameworks, they can come up with more optimal solutions and they can do it faster.
A deep understanding of tools and techniques allows developers to look beyond the most obvious 'naive' solution to find the one which is the most suitable (using existing tools to do as much of the heavy lifting as possible).
Also, when a developer cares deeply about a particular project, they will invest more time reading about relevant technologies in their own time.
When it comes to learning new tools, most engineers are content to 'learn as they go' - That's OK, but it means that they are not as well equipped when it comes to finding that optimal solution.
I think engineers should take time to familiarize themselves with tools REALLY WELL before they start using them, especially if such a tool/framework/technology will impact the project for many years in the future.
There is a point where the glue logic becomes very complex (and brittle) - At that point, the best thing to do is to redesign part of the system's class structure.
If your components (at all levels of your class hierarchy) are specific about their own behaviors, it means that you can use simpler glue logic to make them work together.
When you need to handle a lot of complex use cases, it's often useful to have many specific classes which share the same interface and can be used interchangeably.
It used to be a full-stack framework (with a heavy, opinionated client-side part) but I was the only one working on it and when Meteor, SailsJS etc came along, I understood it didn't stand a chance so I pulled out the realtime and clustering features and used them to focus on just the realtime part and it picked up!
What I noticed is that the more opinionated (and more complete) your framework is, the harder it is to build a community around it.
Developers like to use custom combinations of small, SPECIALIZED tools that only handle a SMALL part of the big problem.
... Unless you're a HOT startup with crazy funding... In this case, developers will trust your product by default. Developer trust is hard to gain - If you're small, you have to play for the long term and keep reinventing and rewriting parts of your project over and over as technologies change.
There are complex social and psychological reasons why people choose to work in particular fields - I oppose the idea of using marketing to steer people into choosing careers which they have no natural interest in.
People spend most of their lives working - It's cruel for companies to manipulate them into lifelong commitments that they never really wanted.