Followup thought: all of the mentioned things so far straddle both planning and implementation. Do we neglect kinds of planning that aren't are distinct from the product code?
-
-
Show this threadThanks. Twitter will use this to make your timeline better. UndoUndo
-
-
-
That’s completely true, but doesn’t really help. It’s just the minimum. The scale of project, goals, evaluation methods (are we done yet?), social/collaborative environment, etc, affect everything. Tighter constraints on how to plan, how to test & adapt, are critical
-
It helps in that it identifies the implicit goal we're seeking. Now we can make that goal explicit, and study it independently of the methods we've so-far used to try and achieve it.
-
eg one of the major benefits of formal specification is it's really, really powerful as a planning tool, but it's often (for many kinds of formal spec) useful _primarily_ as a planning tool without direct code connection.
-
Formally (i.e. mechanically) connecting high-level specifications to code is, unfortunately, intractable (at least currently) except in extreme circumstances. The question is, how important is it, really?
-
It is quite likely that such a formal connection is no easier than compiling the specification to an executable, so it is also possible that such a formal tie is something we'll never need to do, because when we know how to do it we'll be able to do away with code altogether.
End of conversation
New conversation -
-
-
While I think there are substantial differences between the rigor of different types of plans, any planning at all seems to be a big improvement over what appears to be standard practice.
Thanks. Twitter will use this to make your timeline better. UndoUndo
-
-
-
The ones you mentioned are all forms of refinement in a very precise sense.
-
that's interesting, could you please elaborate?
-
A refinement is the process of extracting a subset (and the converse of refinement, abstraction, is the process of finding a superset).
-
Even code describes a whole set of executables, as the compiler and the CPU are free to choose different behaviors as long as they are in the set of those allowed by the code (so the executable and executions are a refinement of the code, and the code is their abstraction).
-
Now, types, contracts and tests are a further abstraction, as they describe an even larger set of allowable programs: all programs that inhabit the type, those whose behaviors satisfy the contract, and those who pass the test.
-
All the techniques Hillel mentioned start with the abstraction, and so the process is one of refinement, i.e., starting with a large set of programs and narrowing it down (refining).
-
Picking a more precise type refines the original type chosen (and if you have subtyping, the relationship is even formal in the language). Same when adding more conditions to the contract. When adding more tests we similarly reduce the set of possible complying programs.
End of conversation
New conversation -
-
-
it sounds even that there is a sort of dialectics in the process
Thanks. Twitter will use this to make your timeline better. UndoUndo
-
-
-
I wonder how often people use those in the ideal “plan-ahead” way, versus writing tests after code, creating types simultaneously, etc. Those still bring value; how would we describe those?
Thanks. Twitter will use this to make your timeline better. UndoUndo
-
-
-
Formal verification/proofs is: Provide enough math so people will trust you. :)
Thanks. Twitter will use this to make your timeline better. UndoUndo
-
-
-
Just different kinds of plans.
Thanks. Twitter will use this to make your timeline better. UndoUndo
-
Loading seems to be taking a while.
Twitter may be over capacity or experiencing a momentary hiccup. Try again or visit Twitter Status for more information.