Software engineering thinking