Learn about problems, not solutions
dwyer.co.za
dwyer.co.za
You're not noticing that you're inadvertently referring to "solutions" in multiple meanings which leads to false equivalence: https://en.wikipedia.org/wiki/Equivocation
E.g. "solution" in "they are solutions, and you shouldn’t learn to use solutions" in your 1st paragraph is referring software tools -- but 2nd paragraph of "solutions" in "bring me solutions, not problems" is about answers or actions to take irrespective of tools.
Because of the above confusion, I think a more accurate title and angle for your essay is "Learn about problems, not specific software tools" ... because people do care about solutions in the generalized non-software-tool sense. E.g. the recent mRNA vaccine is a "solution" to slowing down COVID that's crippling the world.
Also, the following is hard to parse and could use some wordsmithing:
>"(AI is kind of hot, but there are a a ton of wannabe data scientists and few open roles, while the opposite is true for DevOps, study linear algebra and probability theory, either, React, it’s hype),"
Figuring out how to handle ambiguity in writing is difficult. Sometimes a little fuzzing works, I appreciate you supplying an explanation.
If you've worked in real estate, you know, for instance, what the following concepts are:
* MLS
* Brokerage
* Referral fee
* sqft vs total sqft vs aboveground sqft
* pending vs backup status
None of these are rocket science, but knowing the domain deeply will make you a better developer for that problem space.I also liked the author's turn of phrase at the end. I think as a technologist I sometimes am enamored of the solution, when I really should be focusing on the problem. And sometimes technology isn't the answer to the problem.
The greatest of scientists were problem finders. Once you truly grasp and formulate a problem, seeking the expertise to solve it becomes a lot easier .. even trivial in cases.
Startups are about problem finding too. Solutioning is important, but not as important as addressing the right problem.
When you don't understand the problem, you tend to over-engineer with a lot of technology not actually delivering any value. But if you don't understand the solutions, you under-engineer - this is how organisations end up running an ERP through WordPress.
Instead of learning lots about problems, learn about how to listen so you can quickly understand problems.
Look for "active listening" skills.
If a group of engineers in a room have to dream up solutions to a problem, then go research and experiment to learn if they'll work, they will be innovating and learning the problem space in the process. If they dream up these solutions, then search the internet to see if they've been tried and work, they'll just be hill climbing.
Is that the article in question?
Say you create a fun little app that a hundred people download, that you just had a good time making.
What problem did it solve for them? Boredom? Did it solve the same problem for everyone?
That being said, I like the article, and I like the idea of focusing on problems more than solutions, to define a career.
And yes, that app helped fix their boredom.
Look into jobs theory if you're interested in this stuff
If you don't think your software solves a real problem, or will improve people's quality of life, then why release it?
There are already too many distractions in the modern world. I don't want to create more. Any software you release that doesn't solve a real problem is just another distraction that takes time away from people's lives.
I took part in a “training session” at a med school. Basically undergrads were brought in to go through a “PBL” session so the facilitators could get training for the upcoming school year.
Looking for literature in the medical field might help to narrow your search. I think it’s a “flipped classroom”, “Socratic method”, “case studies” approach, or probably goes by a different name in different fields.
You do a bunch of pre-reading and preparation ahead of time. You come into the room and are given a problem statement. Then everyone tries to solve the problem and discussion ensues.
It appears everywhere because everyone knows about the solution.
Or have I missed your point?
What you describe makes sense for small components built by a small, tightly knit and highly skilled team. The issue is that at some point the software grows enough that you can't hold the whole thing in your head at once, or you need to make it reusable to external developers.
But with DI, a service needs to talk to the database? I can either spin up an embedded DB, or, I can pass it a mock DAO to verify it is using the data layer as expected.
(And of course, if there's a real DAO, I'm most likely going to write an integration test that does involve an embedded DB, just to be sure that our Postgres flavoured SQL works. And surprisingly, spinning up an embedded PG isn't that slow. And certainly better than trying to convince HSQL that it's Postgres.)
That said, something I've spent years trying to beat into my fellow Java developers is that the best form of dependency injection is... constructor args.
Make your dependencies constructor args, then you can "inject" whatever the hell you like that conforms to the expected type. You can stick @Autowired on the constructor if you like, go nuts. But even without, well hell, you might not actually need that DI framework, and it's still in a testable space.
As soon as someone starts sticking @Autowired on class fields though, you're fucked. You're annotating JUnit tests with Spring crap, or using Mockito combined with some reflection libraries... ...it's all downhill from there.
But! None of that cruft means that the DI pattern is bad. It's just that people have done very bad things in it's name.
Yes, this is exactly what I mean, the amount of wrong stuff that is in the constructor makes me believe DI is a solution for something else.
Infinite amount of times have I encountered stuff in the constructor that shouldn't be there. Object A has a constructor with a bunch of dependencies, one of them is Object B.
The proper way is for Object B to use object A instead.
Blindly injecting everywhere is my problem with DI. Without these frameworks one would see that dependencies flow in a different direction if proper interfaces are defined.
For example, React Context and useEffect hook is implicit DI yet people have no idea it's DI and I see codebases using React + DI framework instead.
The only DI magic is the topological sort of dependencies and automatic construction. That stuff is 20 lines of additional code so that React.Context and useEffect work the same way.
DI adds complexity to the code just by itself. The best ways to implement it are the ones that add as little complexity as possible, but they are still adding complexity.
So, I wouldn't call it a "bad pattern", but it's not something that should be carelessly decided. The best DI is still no DI, you go for the second best only when you can't use the best.
Lets see..
Edit: it was a quick and useful read. I’m actually struggling with getting motivated, maybe reminding myself from time to time what my main issue I’m focusing on I could recalibrate my priorities, and keep my momentum.