Following certain J language best practices. 1000s of classes. No method may be longer than 25 lines. Inheritance charts that must be printed on the DesignJet. Abstraction for the sake of making work. Public properties are forbidden. No flags or options permitted, only derived classes. All getters and setters methods. Main logic placed in exception handling. No documentation of course. The guy who made the API will have a job for life, after he is fired he will be rehired as a consultant for 4x more. Since nobody can sit down and use his code without years of reverse engineering. A very smart programmer indeed.
Don't invest time in elaborate APIs and abstraction unless you have already have a plan for future improvements which are only limited by funding or minor business model demands at the moment. If you can't whiteboard the plans on why you need abstraction, you dont need it. If you are metriced by the line, go with all the OOP fluff and keep adding classes. If you are paid by the project, go functional with the least amount of typing to get the job done. Nothing I said says to copy code instead of proceduring it.