I view Apple's closed ecosystems with a similar sense of apprehension.
2,962 karma · joined June 20, 2012
https://github.com/wting
[ my public key: https://keybase.io/wting; my proof: https://keybase.io/wting/sigs/yTnPQ0DZR5vV9WRhYq8SP7V56pyKc3Z8fMQQE9cADBQ ]
I view Apple's closed ecosystems with a similar sense of apprehension.
Is it useful for learning about memory? No.
Is it useful for learning about OOP or generics? No.
Is it useful for learning algorithms (compared to Python / Java)? No.
Is it useful for learning about concurrency? Yes.
Is it useful for learning about parallelism? No.
Is it useful for learning about type systems or programming language design? No.
Is it useful for learning about developer tools? Yes.
Is it useful for finding a job? No.
In the end, Go is a pragmatic language growing in popularity. However it's a jack of all trades, master of none and thus fails as a teaching tool.
[0] https://groups.google.com/forum/m/#!msg/golang-nuts/S9goEGuo...
For the record Python uses a generational garbage collector.
OTOH goroutines are green threads multiplexed onto kernel threads (aka N:M thread model).
http://www.infoq.com/presentations/haskell-newsroom-nyt
tldw:
- RoR shop, too slow and can't afford to scale simply by spinning up more AWS instances.
- Haskell type system results in fewer bugs, less downtime than RoR.
- Haskell's Conduit library is great for information flow (e.g. scanning Twitter firehose for breaking stories).
- Static binaries for easy deployment.
- Declarative style and expressiveness helps coworkers understand code quickly.
I'm migrating an in house ORM to SQLAlchemy. Lack of compiler support and/or static code analysis makes the transition more difficult than it needs to be.
Dynamic typing allows one to defer error handling to the future, essentially creating technical debt for the sake of developer speed and convenience. For many use cases this is an acceptable trade off.
However as a codebase grows in complexity, it's better to handle errors as early as possible since the cost of fixing an error grows exponentially the farther it is from the developer (costs in ascending order: editor < compiler < testing < code review < production).
If your problem is numerical in nature, you can call popular C modules (numpy, etc) or write your own.
If your functions and data are pickleable, you can use multiprocessing but run into Amdahl's Law.
Maybe you try Celery / Gearman introducing IO bottlenecks transferring data to workers.
Otherwise you might end up with PyPy (poor CPython extension module support) and still restricted by the GIL. Or you'll try Cython, a bastard of C and Python.
Python has been my primary language the past few years and it's great for exploratory coding, prototypes, or smaller projects. However it's starting to lose some of the charm. Julia is filling in as a great substitute for scientific coding in a single language stack, and Go / Rust / Haskell for the other stuff. I've switched back to the static language camp after working in a multi-MLOC Python codebase.
https://github.com/afriggeri/cv
PDF:
However this isn't allowed in tmux without some hackery / wrapper scripts.
What happens is the competent people bail, leaving behind the less talented and/or less motivated which creates a positive feedback cycle.
If Python is fast enough for you, it’s a fantastic language. The problem is once performance or codebase demands scale, dynamic typing rears its ugly head and there are no simple solutions. At work we sidestep this issue by writing a plethora of tests, but now dynamic typing productivity gains are offset and we spin up a lot of AWS instances for performance.
[0] Go, Rust, Scala. Haskell and OCaml have had it for a while.
Yelp started out as finding a referral for doctors, and recently Yelp has added public data to their respective hospital pages:
http://officialblog.yelp.com/2013/03/study-yelp-ratings-work...
Would about pulling high rated, top-level conversations from multiple sources for a quick digest? Sort of like Google News for commentary.
- new sandbox implementation!
- temporarily ignore upper bound requirements
- dependency freezing
- parallel builds
- no re-linking unless a file has changed if (llama = false)
So use Yoda conditionals instead: if (false == llama)
Is that really an improvement over the original? As I've stated in my sibling reply, you are decreasing human readability for machine readability.Ambiguity and conciseness are orthogonal concepts. Mathematics and formal proofs are very unambiguous, yet they are concise. On the other hand assembly code is unambiguous yet very verbose. Code has to convey two things:
1. "what should be done" to humans
2. "how to do it" to machines
Striking a balance between these two is difficult since it depends on each individual coder and the programming language. That's why there are so many syntax bike shedding wars because what's readable to one isn't necessarily readable to another.
http://www.oracle.com/technetwork/articles/java/java8-option...
Using option types produces more robust code and prevents null pointer exceptions / segfaults. Go's idiom of multiple return values and error is a poor man's Either, which is an improvement on C's return code idiom[0].
[0] C's return code idiom led to the latest GnuTLS bug:
http://blog.existentialize.com/the-story-of-the-gnutls-bug.h...
func DoFoo(Foo foo) Cat {
bar, err := GetBar(foo)
if (err != nil) { return nil }
baz, err := GetBaz(bar)
if (err != nil) { return nil }
cat, err := GetCat(baz)
if (err != nil) { return nil }
return cat
}
Option types add metadata to a type, essentially combining `bar` and `err` into a single variable. Let `Maybe x` mean a function will return `Something x` or `Nothing`. For example (in hypothetical Go): func DoFoo(Foo foo) Maybe Cat {
bar := GetBar(foo)
if (bar.(type) == Nothing) { return Nothing }
baz := GetBaz(bar)
if (baz.(type) == Nothing) { return Nothing }
cat := GetCat(baz)
if (cat.(type) == Nothing) { return Nothing }
return cat
}
Since this is such a common pattern, Haskell has a bind operator (`>>=`) to take advantage of option types by passing the output as the input of the next function if it's a `Something`, or return `Nothing`. func DoFoo(Foo foo) Maybe Cat {
return GetBar foo >>= GetBaz >>= GetCat
}
If you care about why something failed, use an `Either` instead of a `Maybe`. In a language that supports algebraic data types, you could create your own sum type instead.http://demenglog.com/wp-content/uploads/2014/01/toilet-seat-...
Yup, it was enough for my pregnant wife when she was staying at home.
http://www.amazon.com/gp/product/B005XNW1Q0/ref=as_li_ss_tl?...
The Asian food situation is much better in south bay, but that's an hour from the city and thus limited to weekend excursions.
I'm in the whitespace > braces camp, but mandatory braces help with the dangling else problem and makes it easier for the parser.