I find Copilot most useful as a kind of very good autocomplete. One way to think about it is: if I know exactly what the next line should be (e.g. I've done X transformation on dataset A, and I need to do the same transformation on dataset B...), then Copilot excels at filling that new line in for me.
I never ask it to create new ideas from scratch, it just isn't good at that, let alone designing interfaces or figuring out the right data structure.
For example, a common pattern might be typing: "if (x := load_data(...)) is None:", then Copilot will create a reasonable next line given context (in some parts of the codebase, return None, in other parts, raise ValueError; it sees the type annotation of the function so it usually knows which one).
I never ask it to create new ideas from scratch, it just isn't good at that, let alone designing interfaces or figuring out the right data structure.
For example, a common pattern might be typing: "if (x := load_data(...)) is None:", then Copilot will create a reasonable next line given context (in some parts of the codebase, return None, in other parts, raise ValueError; it sees the type annotation of the function so it usually knows which one).