3 ms·
I've worked with engineers who can happily write greenfield code that passes the spec, but fails on any inputs that are not clearly defined as valid. In an effo
by maccard 1y ago
I've worked with engineers who can happily write greenfield code that passes the spec, but fails on any inputs that are not clearly defined as valid. In an effort to fix this, they add layers and layers and layers of complexity and edge cases to the app logic, and intermix the actual app logic with handling invalid input. something like
func isEven(s string) bool {
num, _ := strconv.Atoi(s)
return num % 2 == 0
}
becomes:
func isEven(s string) (string, error) {
f, err := strconv.ParseFloat(s, 64)
if err != nil {
return "invalid", err
}
num := int(f)
if num%2 == 0 {
return "even", nil
}
else if num % 2 != 0 {
return "odd", nil
}
return "invalid", nil
}
Which is.... technically correct, instead of
func isEven(num int) bool {
return num % 2 == 0
}
func isEvenSafe(s string) (bool, error) {
num, err := strconv.Atoi(s)
if err != nil {
return false, err
}
return isEven(num), nil
}
- skydhash 1y agoAlso the ones that can’t understand abstraction and are happy copy-pasters. Or the ones familiar with some paradigms (ex OOP) that brings it everywhere. There are a lot of ways to accumulate tech debt so fast you’d think you’re in a code casino.
- Zanfa 1y agoI’ve definitely seen way too much code like the examples above. Another side effect to this is it tends to leak all over and can result in exponentially more code. What would’ve been a 2-line change at the API boundary, becomes ten lines of manual edgecasing every time it’s used in business logic and results in impossible states that need even further typing and handling. And don’t forget the tests that now need to cover invalid inputs everywhere, not just the API boundary.