Pierwszy punkt dla mnie został nie zrozumiały, jeżeli objaśnisz, to jesteś Bogiem
Chodzi o to, że dobra praktyka zakłada używanie jak najogólniejszego typu. Interfejs List zapewnia Ci metody dodawania, usuwania elementów itd. Jeżeli zmienna jest typu list, to nie ma znaczenia, czy przypiszesz do niej LinkedList, czy ArrayList. We wszystkich miejscach aplikacji, w których odwołasz się do zmiennej typu List będziesz korzystał z ogólnego interfejsu, więc jeżeli nagle uznasz, że LinkedList będzie wydajniejsza od ArrayList, to program Ci się nie wysypie. Inna sprawa, jeżeli będziesz miał konieczność korzystania z metod specyficznych dla danego typu listy - mówię to o bodajże removeFirst, removeLast dla LinkedList. Wtedy typ List musiałbyś rzutować (zła praktyka).