对现代英语,名词复数的压倒性方式是在词尾加s(或变种es)。记住这一条最重要。
不过也存在一些名词,它们的复数不符合上一条原则,比如sheep的复数还是sheep。
从现代英语视角来看,像sheep这样的名词是例外,但从历史角度,也并非是没有一点逻辑的胡整。
sheep源自古英语sceap/scep, 再往前可追到西日耳曼语的*skæpan。
按照《牛津词典》的说法,在原始日耳曼语中,绵羊的单数*skǣp和绵羊的复数*skǣpu是区分的。可是到古英语阶段,*skǣpu的末尾元音u弄丢了。笔者猜测可能是p和pu音差异太小所致。
*skǣpu的末尾元音被弄丢后,绵羊的单数和复数就不区分了。不过,文献也确实也查到某些古方言保留了末尾元音, 比如英格兰最北边诺森伯兰郡,此地古方言的绵羊复数是scipo。
在原始日耳曼语和古英语中,名词复数形式有多种形式,且词尾加s也非主流。

公元1066年发生了诺曼征服,即法国诺曼底公爵威廉带领法国军队征服英国的事件。此征服也给英国带来古法语。古法语和古英语杂交演变出了中古英语。
古法语习惯在词尾加s来表达复数,这自然也会影响中古英语的名词复数(古英语复数之一加-as,可能影响成s)。可是sheep的复数却没有受到太大影响。对其原因,笔者猜测有二。
第一个原因可能是sheep对昂撒人太重要了。绵羊对昂撒人的重要性也可从“圈地运动”窥见一斑。“圈地运动”发生于14世纪至19世纪,是新兴资产阶级剥夺农民土地来养羊。这是载入史册的恶劣事件,它足以说明绵羊在英国存在感非常之强。很显然,与绵羊相关的表达方式的惯性必然很大。
只有少数人使用的表达,可说改就改,因为不需要整个社会的发力。诺曼征服应该没有秦始皇统一六国的那种“车同轨,书同文”的威权和动力,故而古法语的习惯有可能在sheep前败下阵来。
sheep单复同形的第二个原因可能是sheep群体性很强,它们喜欢成群结队地挤在一起,也就是个体性存在感不强,有点像不可数名词。另外绵羊在放牧时也是穿来穿去,不容易数数。
作为对比,山羊goat的群体性不强,它们很少挤成堆,容易数,所以可数性强,因此goats和goat区别感强。
绵羊的现代德语是Schaf,它自然也是从原始日耳曼语的*skæpan演变过来的。Schaf的复数为Schafe,也就是单数和复数有差异。
sheep与fish也略有差异。fish的个体复数还是fish, 这与sheep相同。但主流词典都标了fishes也是fish的复数,而尚无主流词典支持sheeps。
fishes的复数通常被解读“种类复数”,而不是“个体复数”。fishes可以“种类复”的原因可能是“鱼的种类”,即使普通大众一眼看上去也有很多种。sheep之间差异比较小,从而它的种表达需求不强,故而sheeps不常见。
以上有多处系笔者猜测。如果您有更合理猜测,请留言评论。