First, while you can push your code easily to your cloud provider after testing locally on your own machine, you have very limited visibility into how it will work in production. The process is incredibly tedious as you may have to iterate to get the desired performance and scalability addings overhead and costs. Second, every cloud vendor uses different configuration, e.g., setting memory limits and CPU, different orchestration, and exposes different metrics. Third, how does one know if your function is behaving as expected if you don't have visibility into its underpinnings. Fourth, since instrumentation of the function may be proprietary to the cloud vendor, understanding whether it is the cause of application performance becomes harder.