fix bug, polish with shuffle! and product method