One fo the challenges that I'm discovering, as a developer that migrated to data science, is that - in data science - you rarely have the luxury of a well defined end goal.
In my development, we would go to stakeholders in adavcne to find out what the end-goals were, giving us an opportunity to layout the basic structures of the code before any significant coding was done.
With DS however, the definition of the work is - in and of itself - to try and discover that end goal (by investigating the data.) As such, the needs and direction of my code is constantly changing, making it difficult to maintain a good code structure.