Any help or resources will be tremendously appreciated.
If you're asking about mental acuity so you can think faster and solve brain teasers at interviews, many of the other comments in this thread offer great suggestions. Achieving familiarity with the problem space and pure practice are keys.
If you're asking about actual "critical thinking" (though I suspect that is not the case from your description, but it's an interesting topic that you might want to pursue anyway), the classic methods are the Socratic method, disputation and critical discussion of ideas with other people. If you don't have that luxury, you can train yourself by arguing with authors in the margins when you read books. Writing is key -- it helps crystallize thoughts and reveal weaknesses in thinking. Courses in philosophy also help provide a foundation on different approaches to reasoning.
Both will develop your mental stamina, and chess especially will hone your adversarial thinking.
You may even find that your chess fitness is directly comparable to your programming fitness and vice-versa. When you're programming fit through working on some incredibly hard problems in the week (think distributed systems or file systems or algorithms), then your chess will show an improvement. And when you're playing several hours of chess a day against a good opponent, then your programming will likewise benefit and your bug count drop as you naturally start thinking further ahead.
Outside of that apply the concept of katas daily (http://codekata.com)
A ninja is not defined by his sword. Reading books gives you new weapons, but you must learn to use them proficiently. Solving problems is therefore critical.
Some good sources of problems:
Sanjoy Mahajan (2010) "Street Fighting Mathematics"
Xingfeng Zhou (2008) "A Practical Guide to Quantitative Finance Interviews"
Timothy Crack (2019) "Heard on The Street: Quantitative Questions from Wall Street Job Interviews"
Critical thinking: https://en.wikipedia.org/wiki/Critical_thinking
Computational Thinking: https://en.wikipedia.org/wiki/Computational_thinking
> 1. Problem formulation (abstraction);
> 2. Solution expression (automation);
> 3. Solution execution and evaluation (analyses).
Interviewers may be more interested in demonstrating problem solving methods and f thinking aloud than an actual solution in an anxiety-producing scenario.
https://en.wikipedia.org/wiki/Brilliant_(website) ;
> Brilliant offers guided problem-solving based courses in math, science, and engineering, based on National Science Foundation research supporting active learning.[14]
Coding Interview University: https://github.com/jwasham/coding-interview-university
Programmer Competency Matrix: https://github.com/hltbra/programmer-competency-checklist
Inference > See also: https://en.wikipedia.org/wiki/Inference
- Deductive reasoning: https://en.wikipedia.org/wiki/Deductive_reasoning
- Inductive reasoning: https://en.wikipedia.org/wiki/Inductive_reasoning
> This is the [open] textbook for the Foundations of Data Science class at UC Berkeley: "Computational and Inferential Thinking: The Foundations of Data Science" http://inferentialthinking.com/
When I was actively providing advice on the Architectural Registration Examination, I used to see this all the time with the Site Design test. The test gave the test candidate ninety minutes to organize several components on an unfamiliar site against a set of competing requirements and constraints. A common rant in the discussion forum was "I failed even though I've been laying out sites professionally for {N} years," where {N} might be from three to ten.
The first ninety minutes of real world site design consists of opening the civil engineer's email, creating a directory to for the project, saving the attached CAD file, cleaning it up enough to be usable for architectural design purposes, printing the regulatory requirements for the project file, talking with the principal-in-charge about the client requirements, and then going to lunch because it's been four hours and maybe starting on the design in the afternoon or later in the week because that's the way the world works and the client requirements will probably change anyway.
Which is how experience made it easy to fail the test because of the ways the test did not reflect the real world. The real world has depth and a lot it-depends and experience pays off precisely because it handles the depths and makes informed choices about all the it-depends.
Or to put it another way, Fizz-Buzz in TensorFlow, https://joelgrus.com/2016/05/23/fizz-buzz-in-tensorflow/
Also try explaining how to do some task. Give it to someone else and, based only on your instructions, have them try and do the thing you laid out. We're they able to do it effectively? What questions did they have and where did they get confused? These will help you improve your explanation and argument skills.
You can take five a day. You can take 10. People with heavy brain damage (many minutes without oxygen) take 15 a day for six months to learn to walk and talk again, and they get recover.
As for philosophy, trying to pin down subtle distinctions and following the extremely abstract arguments could help. You could start there with text books, or reading in the history of philosophy like Aristotle, Plato, Descartes or maybe by looking up concepts and problems you're already familiar with in SEP.
Good luck and have fun.
[1] hhtp://plato.stanford.edu/
Learning is brain growth that occurs as a result of thinking, largely during rest and sleep following the activity. Exercise will increase the amount of growth that occurs (mentally and physically), and good cardiovascular health is effectively the same thing as good brain health
And, maybe obviously, practice the brain teasers and interview questions. They are a skill that is not the same thing as being mentally sharp
Here's what seems to work for me:
1. Plenty of cardiovascular exercise.
2. Eat well, including plenty of green plants.
3. Get plenty of sleep.
4. Limit online consumption and other unimportant inputs (TV, gaming, podcasts, etc).
5. Practice being bored^W^Wmindfulness. This could be meditating, or just sitting outside contemplatively, or not consuming content while performing #1.
6. Keep spot checking yourself for where you're coming up short with the above 5 items. It's all too easy to fix the issue, feel great, and then fall out of the above habits. But you can't. You've got to stick to the plan.
Also, brain teasers are a BS way to interview. One of the best interviews I had was a mock architecture session (I didn't get the job). They gave me an overview of a project, told me to use AWS tech, and let me ask questions as I worked through a rough architecture.
Then engage in analytical meditation, typically known as Vipassanā in the Buddhist tradition, but essentially it involves analytically decomposing whatever you're meditating on.
I realized that before I ever dove into Tibetan philosophy that I was developing these two as I designed and constructed software (as I'm sure a lot of us do).
I wrote this yesterday after confronting somebody saying something short-sighted: https://github.com/prettydiff/wisdom/blob/master/faulty_prem...
In the process, I could develop a general process to solve problems.
Using systems thinking helped a lot.
1. Physical exercise. Some blend of cardio and strength training is preferable, but at least cardio is pretty much a requirement.
2. Sleep quality. Not just duration, but quality as well. If you have sleep apnea especially (many people do and don't even know it), you need to address that.
Also, if you're getting _interviewed_ in such detail as a consultant, you're playing the consulting game wrong. People should just hire you based on your track record as exemplified by direct recommendations from previous customers and people within your network.
One of the benefits of a consultant from a customer standpoint is that if they determine they've made a mistake, they can just terminate your contract. So an elaborate interview is a waste of time for both sides.
If you want to learn how to think more critically, you need to force yourself to continuously engage new ideas and learn to recognize an author's motivations and biases while still evaluating their arguments objectively, putting aside your own past conclusions temporarily in order to understand their argument. Then do the same for ideas you have previously agreed with, and see which ideas hold up to scrutiny. Only then can you truly call conclusions your own.