Tables design is also very important, plan what table size could be in future, if table data would be very huge or table is used to import external data then table should be partitioned for better performance, as I discussed in my post Determining if a Table Should be Partitioned in Oracle.
Plan field length properly means field length should be the maximum length required for a particular field. Plan indexes properly what field or fields should use index unique or non-unique. Try to plan summary column fields to put in tables and process them for each entry and also try to keep formula column field in a table for not to computing formula in queries but directly into the table, specially for complex formulas for which you are planing to use functions in query.
In an application there is a particular task is there to perform and for that particular task there is requirement to write many procedures and functions for that. In that case you should write a package to accumulate all the procedures and functions and global variable to put in that, so that the calling would be very logical and meaningful. But do not try to write package for the procedures or functions called rarely, because for a single procedure or function the whole package will load in memory and decrease the performance, so for those procedure and functions you can write separately.