When building software, we developers tend to take the How instead of going with the What approach.

The What approach is more of what needs to be done, meanwhile the How is about how to do it. The first Is language-agnostic it can be applied in different languages since it's more abstract and doesn't care about syntax, this way you avoid getting lost in the little details and focus on the bigger picture of building your software. You can engineer something without knowing the How.  

To makes things clearer while using the What approach, let's write an algorithm that will say whether a student has failed or passed his final tests.

function get_student_final_grade(){

As you can see here the code is more understandable and self-descriptive that even a person who doesn't code can understand it.

The get_student() would connect to the database and see if the student exists in the students table if it does it will return it, if not it will display an error message,

The count_student_grades() would get all the test result of the student and following a formula, it will return his final grade

And print_student_resulst() will simply compare the grade returned by the count_student_grades if it's superior to a certain grade threshold, it will display Passed otherwise it returns Failed.

You can see even while describing each function of the algorithm I used the What, I didn't get into the details of How to do it, that's up to you with the language you choose to use to build the algorithm.

You might argue that this can lead into creating a lot of small functions instead of one function that does the job, now overengineering is definitely an issue that a lot of us fall into, but as your codebase gets bigger and more complex you will find that you're repeating yourself more often and that this approach will be helpful because it will help you avoid code duplication.