For me, it took me a while of working on a web app with derived data everywhere (~15 KB raw JSON that gets updated with diffs and recombobulated into different output formats and different intersections of data with live updates), and endless debugging of data transformations by stepping back and forth through the reducer history, before I really "got" it.
On the note of (b), I really like the redux-actions project (https://redux-actions.js.org) for the way its helpers that get rid of most of that. A simple example:
const setValueA = createAction('SET_VALUE_A');
const setValueB = createAction('SET_VALUE_B');
const setValueAB = createAction('SET_VALUE_AB', (a, b) => ({ a, b }));
export const reducer = combineReducers({
valueA: handleActions({
[setValueA]: (state, action) => action.payload
[setValueAB]: (state, action) => action.payload.a
}, null),
valueB: handleActions({
[setValueB]: (state, action) => action.payload
[setValueAB]: (state, action) => action.payload.b
}, null)
});