very cool! Its nice to meet you.
One of the problems I think notebooks suffer from right now is that they're asked to do multiple contradictory things. One one hand, they are iterative, exploratory, debugging/composition/ bespoke visualization environments for scientific programming and data analysis. On the other hand, they are supposed to be authoritative scientific documents which demonstrate how to reproduce a result and publicly shared. While I think its very interesting to explore the relationship between these goals, at least in my experience they lead to very different kinds of programming, and its not clear to me that supporting users in either of these goals is best done through a single environment, which often ends up being a compromise between the two.
For example, a defining feature of Jupyter notebooks is a manual control flow of the cells ā the user can execute the snippets in each cell in whatever order they choose. In the small scale, this is great ā users can write a few lines and then run just those lines to see the result, users can experiment with alternative programs by running cells in different orders, etc. But as soon as we want notebooks to be authoritative documents where we report on science to the community, these features are seen as problematic, leading to "mess" that needs to be "cleaned" or prevented all together (as some alternative notebook systems try to do, like Observable). But I think a danger in making notebooks too clean and streamlined is that you remove all the features which made notebooks compelling iterative, exploratory programming environments in the first place, and we're instead just trying to make notebooks that feel more like a traditional text editor.
My notebooks work has been trying to figure out other ways out of this, that give users the real benefits of notebooks as exploratory programming interfaces while also avoiding the "conversion" process of a "working" notebook to a "publishable" notebook, which are, at least in my experience, very different kinds of documents with different purposes. In
my first project, I wanted to think about how to give the user the freedom to experiment in an interactive computing environment in the small scale (aka small neighborhoods of cells), while giving the notebook as a whole a bit more structure (thats a very abstract way of putting it, but I think just seeing the interface will communicate much better how it actually works).
Right now I'm working on a project which tries to think about notebooks as temporary environments on regular, non-notebook, textual programs. I'm calling it a
Notebook-on-Demand because I want to figure out if we can get many of the benefits of notebooks as interactive programming environments while still having our programs live in regular text files, calling a notebook only when needed for interactive visualization, composition, and debugging. One of the most interesting things about this project for me has been realizing that once we unload the responsibility of the notebook interface to actually contain the entire program we want to run (or at least be the entry point to call other functions), and instead think about how to make a great programming interface for composing/visualizing/debugging
a single function, we can do some fairly interesting things. In the repo I linked, you can see that we now display a callstack navigator of your program in the notebook and allow you to save variables from your program execution to insert manually in your notebook state. I think these would be really confusing if you put these in a regular notebook! But because our program text in a traditional IDE is the place where the program can be organized, the notebook can focus on just the things it does well.